From c29dc56d8f03a403709cbb0417409c7e44ffdd14 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Markus=20Th=C3=B6mmes?= Date: Mon, 6 Dec 2021 14:32:28 +0100 Subject: [PATCH] Drop unnecessary dependencies on vegeta and licenseclassifier (#582) --- go.mod | 15 - go.sum | 56 +- hack/tools.go | 6 - vendor/github.com/c2h5oh/datasize/.gitignore | 24 - vendor/github.com/c2h5oh/datasize/.travis.yml | 14 - vendor/github.com/c2h5oh/datasize/LICENSE | 21 - vendor/github.com/c2h5oh/datasize/README.md | 77 - vendor/github.com/c2h5oh/datasize/datasize.go | 217 --- .../go-openapi/jsonpointer/.travis.yml | 4 +- .../go-openapi/jsonpointer/pointer.go | 62 +- .../go-openapi/jsonreference/.golangci.yml | 41 - .../go-openapi/jsonreference/.travis.yml | 15 +- .../go-openapi/jsonreference/README.md | 2 +- .../go-openapi/jsonreference/go.mod | 2 +- .../go-openapi/jsonreference/go.sum | 10 +- .../go-openapi/spec/contact_info.go | 30 - vendor/github.com/go-openapi/spec/license.go | 30 - .../github.com/go-openapi/swag/.golangci.yml | 19 - vendor/github.com/go-openapi/swag/.travis.yml | 30 +- vendor/github.com/go-openapi/swag/README.md | 1 + vendor/github.com/go-openapi/swag/convert.go | 16 +- .../go-openapi/swag/convert_types.go | 195 +-- vendor/github.com/go-openapi/swag/go.mod | 14 +- vendor/github.com/go-openapi/swag/go.sum | 29 +- vendor/github.com/go-openapi/swag/json.go | 8 +- vendor/github.com/go-openapi/swag/loading.go | 42 +- vendor/github.com/go-openapi/swag/util.go | 6 +- .../google/licenseclassifier/.travis.yml | 16 - .../google/licenseclassifier/CHANGELOG | 14 - .../google/licenseclassifier/CONTRIBUTING.md | 24 - .../google/licenseclassifier/LICENSE | 202 --- .../google/licenseclassifier/README.md | 66 - .../google/licenseclassifier/classifier.go | 472 ------ .../file_system_resources.go | 68 - .../google/licenseclassifier/forbidden.go | 48 - .../google/licenseclassifier/go.mod | 9 - .../google/licenseclassifier/go.sum | 11 - .../licenseclassifier/internal/sets/sets.go | 20 - .../internal/sets/stringset.go | 228 --- .../google/licenseclassifier/license_type.go | 394 ----- .../stringclassifier/CONTRIBUTING.md | 24 - .../stringclassifier/LICENSE | 202 --- .../stringclassifier/README.md | 65 - .../stringclassifier/classifier.go | 560 ------- .../stringclassifier/internal/pq/priority.go | 111 -- .../stringclassifier/searchset/searchset.go | 491 ------ .../searchset/tokenizer/tokenizer.go | 175 --- .../github.com/imdario/mergo/.deepsource.toml | 12 - vendor/github.com/imdario/mergo/.travis.yml | 2 - vendor/github.com/imdario/mergo/README.md | 18 +- vendor/github.com/imdario/mergo/map.go | 8 +- vendor/github.com/imdario/mergo/merge.go | 261 +--- .../github.com/influxdata/tdigest/.gitignore | 1 - vendor/github.com/influxdata/tdigest/LICENSE | 202 --- .../github.com/influxdata/tdigest/README.md | 42 - .../github.com/influxdata/tdigest/centroid.go | 60 - vendor/github.com/influxdata/tdigest/go.mod | 10 - vendor/github.com/influxdata/tdigest/go.sum | 9 - .../github.com/influxdata/tdigest/tdigest.go | 276 ---- vendor/github.com/josharian/intern/README.md | 5 - vendor/github.com/josharian/intern/go.mod | 3 - vendor/github.com/josharian/intern/intern.go | 44 - vendor/github.com/josharian/intern/license.md | 21 - .../github.com/mailru/easyjson/buffer/pool.go | 72 +- .../mailru/easyjson/jlexer/lexer.go | 230 +-- .../mailru/easyjson/jwriter/writer.go | 41 +- vendor/github.com/sergi/go-diff/AUTHORS | 25 - vendor/github.com/sergi/go-diff/CONTRIBUTORS | 32 - vendor/github.com/sergi/go-diff/LICENSE | 20 - .../sergi/go-diff/diffmatchpatch/diff.go | 1345 ----------------- .../go-diff/diffmatchpatch/diffmatchpatch.go | 46 - .../sergi/go-diff/diffmatchpatch/match.go | 160 -- .../sergi/go-diff/diffmatchpatch/mathutil.go | 23 - .../diffmatchpatch/operation_string.go | 17 - .../sergi/go-diff/diffmatchpatch/patch.go | 556 ------- .../go-diff/diffmatchpatch/stringutil.go | 88 -- vendor/github.com/tsenart/go-tsz/.gitignore | 3 - vendor/github.com/tsenart/go-tsz/.travis.yml | 38 - vendor/github.com/tsenart/go-tsz/LICENSE | 230 --- vendor/github.com/tsenart/go-tsz/Makefile | 203 --- vendor/github.com/tsenart/go-tsz/README.md | 41 - vendor/github.com/tsenart/go-tsz/VERSION | 1 - vendor/github.com/tsenart/go-tsz/bstream.go | 222 --- vendor/github.com/tsenart/go-tsz/fuzz.go | 69 - .../tsenart/go-tsz/testdata/data.go | 264 ---- vendor/github.com/tsenart/go-tsz/tsz.go | 385 ----- vendor/github.com/tsenart/vegeta/.gitignore | 34 - .../github.com/tsenart/vegeta/.goreleaser.yml | 35 - vendor/github.com/tsenart/vegeta/.travis.yml | 12 - vendor/github.com/tsenart/vegeta/CHANGELOG | 87 -- vendor/github.com/tsenart/vegeta/Gopkg.lock | 169 --- vendor/github.com/tsenart/vegeta/Gopkg.toml | 74 - vendor/github.com/tsenart/vegeta/LICENSE | 20 - vendor/github.com/tsenart/vegeta/Makefile | 25 - vendor/github.com/tsenart/vegeta/README.md | 803 ---------- vendor/github.com/tsenart/vegeta/attack.go | 242 --- .../tsenart/vegeta/attack_nonwindows.go | 9 - .../tsenart/vegeta/attack_windows.go | 5 - vendor/github.com/tsenart/vegeta/dump.go | 11 - vendor/github.com/tsenart/vegeta/encode.go | 119 -- vendor/github.com/tsenart/vegeta/file.go | 62 - vendor/github.com/tsenart/vegeta/flags.go | 134 -- .../vegeta/internal/resolver/resolver.go | 78 - .../github.com/tsenart/vegeta/lib/attack.go | 372 ----- .../tsenart/vegeta/lib/histogram.go | 82 - .../tsenart/vegeta/lib/lttb/lttb.go | 96 -- .../github.com/tsenart/vegeta/lib/metrics.go | 188 --- vendor/github.com/tsenart/vegeta/lib/pacer.go | 279 ---- .../tsenart/vegeta/lib/plot/assets.go | 10 - .../tsenart/vegeta/lib/plot/assets_vfsdata.go | 252 --- .../tsenart/vegeta/lib/plot/plot.go | 400 ----- .../tsenart/vegeta/lib/plot/timeseries.go | 56 - .../tsenart/vegeta/lib/reporters.go | 252 --- .../github.com/tsenart/vegeta/lib/results.go | 241 --- .../tsenart/vegeta/lib/results_easyjson.go | 165 -- .../tsenart/vegeta/lib/target.schema.json | 39 - .../github.com/tsenart/vegeta/lib/targets.go | 371 ----- .../tsenart/vegeta/lib/targets_easyjson.go | 167 -- vendor/github.com/tsenart/vegeta/main.go | 117 -- vendor/github.com/tsenart/vegeta/plot.go | 109 -- vendor/github.com/tsenart/vegeta/report.go | 169 --- .../tsenart/vegeta/report_nonwindows.go | 14 - .../tsenart/vegeta/report_windows.go | 14 - vendor/golang.org/x/time/rate/rate.go | 20 +- vendor/modules.txt | 55 +- 125 files changed, 360 insertions(+), 14298 deletions(-) delete mode 100644 vendor/github.com/c2h5oh/datasize/.gitignore delete mode 100644 vendor/github.com/c2h5oh/datasize/.travis.yml delete mode 100644 vendor/github.com/c2h5oh/datasize/LICENSE delete mode 100644 vendor/github.com/c2h5oh/datasize/README.md delete mode 100644 vendor/github.com/c2h5oh/datasize/datasize.go delete mode 100644 vendor/github.com/go-openapi/jsonreference/.golangci.yml delete mode 100644 vendor/github.com/google/licenseclassifier/.travis.yml delete mode 100644 vendor/github.com/google/licenseclassifier/CHANGELOG delete mode 100644 vendor/github.com/google/licenseclassifier/CONTRIBUTING.md delete mode 100644 vendor/github.com/google/licenseclassifier/LICENSE delete mode 100644 vendor/github.com/google/licenseclassifier/README.md delete mode 100644 vendor/github.com/google/licenseclassifier/classifier.go delete mode 100644 vendor/github.com/google/licenseclassifier/file_system_resources.go delete mode 100644 vendor/github.com/google/licenseclassifier/forbidden.go delete mode 100644 vendor/github.com/google/licenseclassifier/go.mod delete mode 100644 vendor/github.com/google/licenseclassifier/go.sum delete mode 100644 vendor/github.com/google/licenseclassifier/internal/sets/sets.go delete mode 100644 vendor/github.com/google/licenseclassifier/internal/sets/stringset.go delete mode 100644 vendor/github.com/google/licenseclassifier/license_type.go delete mode 100644 vendor/github.com/google/licenseclassifier/stringclassifier/CONTRIBUTING.md delete mode 100644 vendor/github.com/google/licenseclassifier/stringclassifier/LICENSE delete mode 100644 vendor/github.com/google/licenseclassifier/stringclassifier/README.md delete mode 100644 vendor/github.com/google/licenseclassifier/stringclassifier/classifier.go delete mode 100644 vendor/github.com/google/licenseclassifier/stringclassifier/internal/pq/priority.go delete mode 100644 vendor/github.com/google/licenseclassifier/stringclassifier/searchset/searchset.go delete mode 100644 vendor/github.com/google/licenseclassifier/stringclassifier/searchset/tokenizer/tokenizer.go delete mode 100644 vendor/github.com/imdario/mergo/.deepsource.toml delete mode 100644 vendor/github.com/influxdata/tdigest/.gitignore delete mode 100644 vendor/github.com/influxdata/tdigest/LICENSE delete mode 100644 vendor/github.com/influxdata/tdigest/README.md delete mode 100644 vendor/github.com/influxdata/tdigest/centroid.go delete mode 100644 vendor/github.com/influxdata/tdigest/go.mod delete mode 100644 vendor/github.com/influxdata/tdigest/go.sum delete mode 100644 vendor/github.com/influxdata/tdigest/tdigest.go delete mode 100644 vendor/github.com/josharian/intern/README.md delete mode 100644 vendor/github.com/josharian/intern/go.mod delete mode 100644 vendor/github.com/josharian/intern/intern.go delete mode 100644 vendor/github.com/josharian/intern/license.md delete mode 100644 vendor/github.com/sergi/go-diff/AUTHORS delete mode 100644 vendor/github.com/sergi/go-diff/CONTRIBUTORS delete mode 100644 vendor/github.com/sergi/go-diff/LICENSE delete mode 100644 vendor/github.com/sergi/go-diff/diffmatchpatch/diff.go delete mode 100644 vendor/github.com/sergi/go-diff/diffmatchpatch/diffmatchpatch.go delete mode 100644 vendor/github.com/sergi/go-diff/diffmatchpatch/match.go delete mode 100644 vendor/github.com/sergi/go-diff/diffmatchpatch/mathutil.go delete mode 100644 vendor/github.com/sergi/go-diff/diffmatchpatch/operation_string.go delete mode 100644 vendor/github.com/sergi/go-diff/diffmatchpatch/patch.go delete mode 100644 vendor/github.com/sergi/go-diff/diffmatchpatch/stringutil.go delete mode 100644 vendor/github.com/tsenart/go-tsz/.gitignore delete mode 100644 vendor/github.com/tsenart/go-tsz/.travis.yml delete mode 100644 vendor/github.com/tsenart/go-tsz/LICENSE delete mode 100644 vendor/github.com/tsenart/go-tsz/Makefile delete mode 100644 vendor/github.com/tsenart/go-tsz/README.md delete mode 100644 vendor/github.com/tsenart/go-tsz/VERSION delete mode 100644 vendor/github.com/tsenart/go-tsz/bstream.go delete mode 100644 vendor/github.com/tsenart/go-tsz/fuzz.go delete mode 100644 vendor/github.com/tsenart/go-tsz/testdata/data.go delete mode 100644 vendor/github.com/tsenart/go-tsz/tsz.go delete mode 100644 vendor/github.com/tsenart/vegeta/.gitignore delete mode 100644 vendor/github.com/tsenart/vegeta/.goreleaser.yml delete mode 100644 vendor/github.com/tsenart/vegeta/.travis.yml delete mode 100644 vendor/github.com/tsenart/vegeta/CHANGELOG delete mode 100644 vendor/github.com/tsenart/vegeta/Gopkg.lock delete mode 100644 vendor/github.com/tsenart/vegeta/Gopkg.toml delete mode 100644 vendor/github.com/tsenart/vegeta/LICENSE delete mode 100644 vendor/github.com/tsenart/vegeta/Makefile delete mode 100644 vendor/github.com/tsenart/vegeta/README.md delete mode 100644 vendor/github.com/tsenart/vegeta/attack.go delete mode 100644 vendor/github.com/tsenart/vegeta/attack_nonwindows.go delete mode 100644 vendor/github.com/tsenart/vegeta/attack_windows.go delete mode 100644 vendor/github.com/tsenart/vegeta/dump.go delete mode 100644 vendor/github.com/tsenart/vegeta/encode.go delete mode 100644 vendor/github.com/tsenart/vegeta/file.go delete mode 100644 vendor/github.com/tsenart/vegeta/flags.go delete mode 100644 vendor/github.com/tsenart/vegeta/internal/resolver/resolver.go delete mode 100644 vendor/github.com/tsenart/vegeta/lib/attack.go delete mode 100644 vendor/github.com/tsenart/vegeta/lib/histogram.go delete mode 100644 vendor/github.com/tsenart/vegeta/lib/lttb/lttb.go delete mode 100644 vendor/github.com/tsenart/vegeta/lib/metrics.go delete mode 100644 vendor/github.com/tsenart/vegeta/lib/pacer.go delete mode 100644 vendor/github.com/tsenart/vegeta/lib/plot/assets.go delete mode 100644 vendor/github.com/tsenart/vegeta/lib/plot/assets_vfsdata.go delete mode 100644 vendor/github.com/tsenart/vegeta/lib/plot/plot.go delete mode 100644 vendor/github.com/tsenart/vegeta/lib/plot/timeseries.go delete mode 100644 vendor/github.com/tsenart/vegeta/lib/reporters.go delete mode 100644 vendor/github.com/tsenart/vegeta/lib/results.go delete mode 100644 vendor/github.com/tsenart/vegeta/lib/results_easyjson.go delete mode 100644 vendor/github.com/tsenart/vegeta/lib/target.schema.json delete mode 100644 vendor/github.com/tsenart/vegeta/lib/targets.go delete mode 100644 vendor/github.com/tsenart/vegeta/lib/targets_easyjson.go delete mode 100644 vendor/github.com/tsenart/vegeta/main.go delete mode 100644 vendor/github.com/tsenart/vegeta/plot.go delete mode 100644 vendor/github.com/tsenart/vegeta/report.go delete mode 100644 vendor/github.com/tsenart/vegeta/report_nonwindows.go delete mode 100644 vendor/github.com/tsenart/vegeta/report_windows.go diff --git a/go.mod b/go.mod index 57d123ec..bf80a1c3 100644 --- a/go.mod +++ b/go.mod @@ -3,23 +3,8 @@ module knative.dev/caching go 1.15 require ( - github.com/c2h5oh/datasize v0.0.0-20200112174442-28bbd4740fee // indirect - github.com/dgryski/go-gk v0.0.0-20200319235926-a69029f61654 // indirect - github.com/go-openapi/jsonpointer v0.19.5 // indirect - github.com/go-openapi/jsonreference v0.19.5 // indirect - github.com/go-openapi/spec v0.19.6 // indirect - github.com/go-openapi/swag v0.19.15 // indirect github.com/google/go-cmp v0.5.6 - github.com/google/licenseclassifier v0.0.0-20200708223521-3d09a0ea2f39 - github.com/imdario/mergo v0.3.9 // indirect - github.com/influxdata/tdigest v0.0.1 // indirect - github.com/mailru/easyjson v0.7.7 // indirect - github.com/miekg/dns v1.1.29 // indirect - github.com/sergi/go-diff v1.1.0 // indirect - github.com/tsenart/go-tsz v0.0.0-20180814235614-0bd30b3df1c3 // indirect - github.com/tsenart/vegeta v12.7.1-0.20190725001342-b5f4fca92137+incompatible go.uber.org/zap v1.19.1 - golang.org/x/time v0.0.0-20210723032227-1f47c861a9ac // indirect k8s.io/api v0.21.4 k8s.io/apimachinery v0.21.4 k8s.io/client-go v0.21.4 diff --git a/go.sum b/go.sum index 2d4e4103..4669dee1 100644 --- a/go.sum +++ b/go.sum @@ -95,11 +95,8 @@ github.com/blang/semver v3.5.1+incompatible/go.mod h1:kRBLl5iJ+tD4TcOOxsy/0fnweb github.com/blang/semver/v4 v4.0.0/go.mod h1:IbckMUScFkM3pff0VJDNKRiT6TG/YpiHIM2yvyW5YoQ= github.com/blendle/zapdriver v1.3.1 h1:C3dydBOWYRiOk+B8X9IVZ5IOe+7cl+tGOexN4QqHfpE= github.com/blendle/zapdriver v1.3.1/go.mod h1:mdXfREi6u5MArG4j9fewC+FGnXaBR+T4Ox4J2u4eHCc= -github.com/bmizerany/perks v0.0.0-20141205001514-d9a9656a3a4b h1:AP/Y7sqYicnjGDfD5VcY4CIfh1hRXBUavxrvELjTiOE= github.com/bmizerany/perks v0.0.0-20141205001514-d9a9656a3a4b/go.mod h1:ac9efd0D1fsDb3EJvhqgXRbFx7bs2wqZ10HQPeU8U/Q= github.com/c2h5oh/datasize v0.0.0-20171227191756-4eba002a5eae/go.mod h1:S/7n9copUssQ56c7aAgHqftWO4LTf4xY6CGWt8Bc+3M= -github.com/c2h5oh/datasize v0.0.0-20200112174442-28bbd4740fee h1:BnPxIde0gjtTnc9Er7cxvBk8DHLWhEux0SxayC8dP6I= -github.com/c2h5oh/datasize v0.0.0-20200112174442-28bbd4740fee/go.mod h1:S/7n9copUssQ56c7aAgHqftWO4LTf4xY6CGWt8Bc+3M= github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= github.com/census-instrumentation/opencensus-proto v0.3.0 h1:t/LhUZLVitR1Ow2YOnduCsavhwFUklBMoGVYUCqmCqk= github.com/census-instrumentation/opencensus-proto v0.3.0/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= @@ -139,9 +136,6 @@ 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/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= github.com/dgryski/go-gk v0.0.0-20140819190930-201884a44051/go.mod h1:qm+vckxRlDt0aOla0RYJJVeqHZlWfOm2UIxHaqPB46E= -github.com/dgryski/go-gk v0.0.0-20200319235926-a69029f61654 h1:XOPLOMn/zT4jIgxfxSsoXPxkrzz0FaCHwp33x5POJ+Q= -github.com/dgryski/go-gk v0.0.0-20200319235926-a69029f61654/go.mod h1:qm+vckxRlDt0aOla0RYJJVeqHZlWfOm2UIxHaqPB46E= -github.com/dgryski/go-lttb v0.0.0-20180810165845-318fcdf10a77 h1:iRnqZBF0a1hoOOjOdPKf+IxqlJZOas7A48j77RAc7Yg= github.com/dgryski/go-lttb v0.0.0-20180810165845-318fcdf10a77/go.mod h1:Va5MyIzkU0rAM92tn3hb3Anb7oz7KcnixF49+2wOMe4= github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no= github.com/docopt/docopt-go v0.0.0-20180111231733-ee0de3bc6815/go.mod h1:WwZ+bS3ebgob9U8Nd0kOddGdZWjyMGR8Wziv+TBNwSE= @@ -194,21 +188,17 @@ github.com/go-logr/logr v0.2.0/go.mod h1:z6/tIYblkpsD+a4lm/fGIIU9mZ+XfAiaFtq7xTg github.com/go-logr/logr v0.4.0 h1:K7/B1jt6fIBQVd4Owv2MqGQClcgf0R266+7C/QjRcLc= github.com/go-logr/logr v0.4.0/go.mod h1:z6/tIYblkpsD+a4lm/fGIIU9mZ+XfAiaFtq7xTgseGU= github.com/go-openapi/jsonpointer v0.19.2/go.mod h1:3akKfEdA7DF1sugOqz1dVQHBcuDBPKZGEoHC/NkiQRg= +github.com/go-openapi/jsonpointer v0.19.3 h1:gihV7YNZK1iK6Tgwwsxo2rJbD1GTbdm72325Bq8FI3w= github.com/go-openapi/jsonpointer v0.19.3/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= -github.com/go-openapi/jsonpointer v0.19.5 h1:gZr+CIYByUqjcgeLXnQu2gHYQC9o73G2XUeOFYEICuY= -github.com/go-openapi/jsonpointer v0.19.5/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= github.com/go-openapi/jsonreference v0.19.2/go.mod h1:jMjeRr2HHw6nAVajTXJ4eiUwohSTlpa0o73RUL1owJc= +github.com/go-openapi/jsonreference v0.19.3 h1:5cxNfTy0UVC3X8JL5ymxzyoUZmo8iZb+jeTWn7tUa8o= github.com/go-openapi/jsonreference v0.19.3/go.mod h1:rjx6GuL8TTa9VaixXglHmQmIL98+wF9xc8zWvFonSJ8= -github.com/go-openapi/jsonreference v0.19.5 h1:1WJP/wi4OjB4iV8KVbH73rQaoialJrqv8gitZLxGLtM= -github.com/go-openapi/jsonreference v0.19.5/go.mod h1:RdybgQwPxbL4UEjuAruzK1x3nE69AqPYEJeo/TWfEeg= github.com/go-openapi/spec v0.19.3/go.mod h1:FpwSN1ksY1eteniUU7X0N/BgJ7a4WvBFVA8Lj9mJglo= +github.com/go-openapi/spec v0.19.5 h1:Xm0Ao53uqnk9QE/LlYV5DEU09UAgpliA85QoT9LzqPw= github.com/go-openapi/spec v0.19.5/go.mod h1:Hm2Jr4jv8G1ciIAo+frC/Ft+rR2kQDh8JHKHb3gWUSk= -github.com/go-openapi/spec v0.19.6 h1:rMMMj8cV38KVXK7SFc+I2MWClbEfbK705+j+dyqun5g= -github.com/go-openapi/spec v0.19.6/go.mod h1:Hm2Jr4jv8G1ciIAo+frC/Ft+rR2kQDh8JHKHb3gWUSk= github.com/go-openapi/swag v0.19.2/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= +github.com/go-openapi/swag v0.19.5 h1:lTz6Ys4CmqqCQmZPBlbQENR1/GucA2bzYTE12Pw4tFY= github.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= -github.com/go-openapi/swag v0.19.15 h1:D2NRCBzS9/pEY3gP9Nl8aDqGUcPFrwG2p+CNFrLyrCM= -github.com/go-openapi/swag v0.19.15/go.mod h1:QYRuS/SOXUCsnplDa677K7+DxSOj6IPNl/eQntq43wQ= github.com/go-stack/stack v1.8.0 h1:5SgMzNM5HxrEjV0ww2lTmX6E2Izsfxas4+YHWRs3Lsk= github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg7847qk6SyHyPtNmDHnmrv/HOrqktSC+C9fM+CJOE= @@ -287,8 +277,6 @@ github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/ github.com/google/gofuzz v1.1.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0= github.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= -github.com/google/licenseclassifier v0.0.0-20200708223521-3d09a0ea2f39 h1:nkr7S2ETn5pAuBeeoZggV5nXSwOm4nBLz3vscQfA/A8= -github.com/google/licenseclassifier v0.0.0-20200708223521-3d09a0ea2f39/go.mod h1:qsqn2hxC+vURpyBRygGUuinTO42MFRLcsmQ/P8v94+M= github.com/google/mako v0.0.0-20190821191249-122f8dcef9e3/go.mod h1:YzLcVlL+NqWnmUEPuhS1LxDDwGO9WNbVlEXaF4IH35g= github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= @@ -363,13 +351,10 @@ github.com/hashicorp/serf v0.8.2/go.mod h1:6hOLApaqBFA1NXqRQAsxw9QxuDEvNxSQRwA/J github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= +github.com/imdario/mergo v0.3.5 h1:JboBksRwiiAJWvIYJVo46AfV+IAIKZpfrSzVKj42R4Q= github.com/imdario/mergo v0.3.5/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= -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/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= github.com/influxdata/tdigest v0.0.0-20180711151920-a7d76c6f093a/go.mod h1:9GkyshztGufsdPQWjH+ifgnIr3xNUL5syI70g2dzU1o= -github.com/influxdata/tdigest v0.0.1 h1:XpFptwYmnEKUqmkcDjrzffswZ3nvNeevbUSLPP/ZzIY= -github.com/influxdata/tdigest v0.0.1/go.mod h1:Z0kXnxzbTC2qrx4NaIzYkE1k66+6oEDQTvL95hQFh5Y= github.com/jcmturner/aescts/v2 v2.0.0/go.mod h1:AiaICIRyfYg35RUkr8yESTqvSy7csK90qZ5xfvvsoNs= github.com/jcmturner/dnsutils/v2 v2.0.0/go.mod h1:b0TnjGOvI/n42bZa+hmXL+kFJZsFT7G4t3HTlQ184QM= github.com/jcmturner/gofork v1.0.0/go.mod h1:MK8+TM0La+2rjBD4jE12Kj1pCCxK7d2LK/UM3ncEo0o= @@ -378,8 +363,6 @@ github.com/jcmturner/gokrb5/v8 v8.4.2/go.mod h1:sb+Xq/fTY5yktf/VxLsE3wlfPqQjp0aW github.com/jcmturner/rpc/v2 v2.0.3/go.mod h1:VUJYCIDm3PVOEHw8sgt091/20OJjskO/YJki3ELg/Hc= github.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= -github.com/josharian/intern v1.0.0 h1:vlS4z54oSdjm0bgjRigI+G1HpF+tI+9rE5LLzOg8HmY= -github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y= github.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4= github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= github.com/json-iterator/go v1.1.7/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= @@ -413,10 +396,8 @@ github.com/lyft/protoc-gen-validate v0.0.13/go.mod h1:XbGvPuh87YZc5TdIa2/I4pLk0Q github.com/magiconair/properties v1.8.1/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= +github.com/mailru/easyjson v0.7.0 h1:aizVhC/NAAcKWb+5QsU1iNOZb4Yws5UO2I+aIprQITM= github.com/mailru/easyjson v0.7.0/go.mod h1:KAzv3t3aY1NaHWoQz1+4F1ccyAH66Jk7yos7ldAVICs= -github.com/mailru/easyjson v0.7.6/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= -github.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0= -github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= github.com/mattn/go-isatty v0.0.4/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= @@ -426,8 +407,6 @@ github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182aff github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4= github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= github.com/miekg/dns v1.1.17/go.mod h1:WgzbA6oji13JREwiNsRDNfl7jYdPnmz+VEuLrA+/48M= -github.com/miekg/dns v1.1.29 h1:xHBEhR+t5RzcFJjBLJlax2daXOrTYtr9z4WdKEfWFzg= -github.com/miekg/dns v1.1.29/go.mod h1:KNUDUusw/aVsxyTYZM1oqvCicbwhgbNgztCETuNZ7xM= github.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc= github.com/mitchellh/go-homedir v1.0.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= @@ -524,9 +503,6 @@ github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFR github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= -github.com/sergi/go-diff v1.0.0/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAmXWZgo= -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/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= @@ -550,7 +526,6 @@ github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= github.com/spf13/viper v1.7.0/go.mod h1:8WkrPz2fc9jxqZNCJI/76HCieCp4Q8HaLFoCha5qpdg= github.com/streadway/amqp v0.0.0-20190404075320-75d898a42a94/go.mod h1:AZpEONHx3DKn8O/DFsRAY58/XVQiIPMTMB1SddzLXVw= -github.com/streadway/quantile v0.0.0-20150917103942-b0c588724d25 h1:7z3LSn867ex6VSaahyKadf4WtSsJIgne6A1WLOAGM8A= github.com/streadway/quantile v0.0.0-20150917103942-b0c588724d25/go.mod h1:lbP8tGiBjZ5YWIc2fzuRpTaz0b/53vT6PEs3QuAWzuU= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= @@ -566,10 +541,6 @@ github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69 github.com/tmc/grpc-websocket-proxy v0.0.0-20170815181823-89b8d40f7ca8/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= github.com/tsenart/go-tsz v0.0.0-20180814232043-cdeb9e1e981e/go.mod h1:SWZznP1z5Ki7hDT2ioqiFKEse8K9tU2OUvaRI0NeGQo= -github.com/tsenart/go-tsz v0.0.0-20180814235614-0bd30b3df1c3 h1:pcQGQzTwCg//7FgVywqge1sW9Yf8VMsMdG58MI5kd8s= -github.com/tsenart/go-tsz v0.0.0-20180814235614-0bd30b3df1c3/go.mod h1:SWZznP1z5Ki7hDT2ioqiFKEse8K9tU2OUvaRI0NeGQo= -github.com/tsenart/vegeta v12.7.1-0.20190725001342-b5f4fca92137+incompatible h1:ErZrHhRveAoznVW80gbrxz+qxJNydpA2fcQxTPHkZbU= -github.com/tsenart/vegeta v12.7.1-0.20190725001342-b5f4fca92137+incompatible/go.mod h1:Smz/ZWfhKRcyDDChZkG3CyTHdj87lHzio/HOCkbndXM= github.com/tsenart/vegeta/v12 v12.8.4/go.mod h1:ZiJtwLn/9M4fTPdMY7bdbIeyNeFVE8/AHbWFqCsUuho= github.com/urfave/cli v1.20.0/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA= github.com/urfave/cli/v2 v2.3.0/go.mod h1:LJmUH05zAU44vOAcrfzZQKsZbVcdbOG8rtL3/XcUArI= @@ -622,9 +593,7 @@ golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPh golang.org/x/crypto v0.0.0-20201002170205-7f63de1d35b0/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20201112155050-0c6587e931a9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20210220033148-5ea612d1eb83/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= -golang.org/x/crypto v0.0.0-20210920023735-84f357641f63 h1:kETrAMYZq6WVGPa8IIixL0CaEcIUNi+1WX7grUoi3y8= golang.org/x/crypto v0.0.0-20210920023735-84f357641f63/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= @@ -634,7 +603,6 @@ golang.org/x/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u0 golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM= -golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6 h1:QE6XYQK6naiK1EPAe1g/ILLxN5RBoH5xkJk3CqlMI/Y= golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= @@ -685,7 +653,6 @@ golang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLL golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190813141303-74dc4d7220e7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190827160401-ba9fcec4b297/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190923162816-aa69164e4478/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20191002035440-2ec189313ef0/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= @@ -767,7 +734,6 @@ golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190826190057-c7b8b68b1456/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190924154521-2837fb4f24fe/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -838,11 +804,9 @@ golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxb golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.0.0-20210220033141-f8bda1e9f3ba h1:O8mE0/t419eoIwhTFpKVkHiTs/Igowgfkj25AcZrtiE= golang.org/x/time v0.0.0-20210220033141-f8bda1e9f3ba/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20210723032227-1f47c861a9ac h1:7zkz7BUtwNFFqcowJ+RIgu2MaV/MapERkDIy+mwPyjs= -golang.org/x/time v0.0.0-20210723032227-1f47c861a9ac/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20180525024113-a5b4c53f6e8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= 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-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= @@ -868,7 +832,6 @@ golang.org/x/tools v0.0.0-20191115202509-3a792d9c32b2/go.mod h1:b+2E5dAYhXwXZwtn golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191125144606-a911d9008d1f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191216052735-49a3e744a425/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20191216173652-a0e659d51361/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200117161641-43d50277825c/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= @@ -913,10 +876,6 @@ golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 h1:go1bK/D/BFZV2I8cIQd1N golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= gomodules.xyz/jsonpatch/v2 v2.2.0 h1:4pT439QV83L+G9FkcCriY6EkpcK6r6bK+A5FBUMI7qY= gomodules.xyz/jsonpatch/v2 v2.2.0/go.mod h1:WXp+iVDkoLQqPudfQ9GBlwB2eZ5DKOnjQZCYdOS8GPY= -gonum.org/v1/gonum v0.0.0-20181121035319-3f7ecaa7e8ca h1:PupagGYwj8+I4ubCxcmcBRk3VlUWtTg5huQpZR9flmE= -gonum.org/v1/gonum v0.0.0-20181121035319-3f7ecaa7e8ca/go.mod h1:Y+Yx5eoAFn32cQvJDxZx5Dpnq+c3wtXuadVZAcxbbBo= -gonum.org/v1/netlib v0.0.0-20181029234149-ec6d1f5cefe6 h1:4WsZyVtkthqrHTbDCJfiTs8IWNYE4uvsSDgaV6xpp+o= -gonum.org/v1/netlib v0.0.0-20181029234149-ec6d1f5cefe6/go.mod h1:wa6Ws7BG/ESfp6dHfk7C6KdzKA7wR7u/rKwOGE66zvw= google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M= google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= @@ -1094,7 +1053,6 @@ gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gopkg.in/yaml.v3 v3.0.0-20200615113413-eeeca48fe776/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b h1:h8qDotaEPuJATrMmW04NCwg7v22aHH28wwpauUhK9Oo= gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gotest.tools/v3 v3.0.2/go.mod h1:3SzNCllyD9/Y+b5r9JIKQ474KzkZyqLqEfYqMsX94Bk= diff --git a/hack/tools.go b/hack/tools.go index 14c5f0e6..f78b4d0d 100644 --- a/hack/tools.go +++ b/hack/tools.go @@ -33,10 +33,4 @@ import ( _ "k8s.io/code-generator/cmd/lister-gen" _ "k8s.io/kube-openapi/cmd/openapi-gen" _ "knative.dev/pkg/codegen/cmd/injection-gen" - - // Licenseclassifier - _ "github.com/google/licenseclassifier" - - // For load testing - _ "github.com/tsenart/vegeta" ) diff --git a/vendor/github.com/c2h5oh/datasize/.gitignore b/vendor/github.com/c2h5oh/datasize/.gitignore deleted file mode 100644 index daf913b1..00000000 --- a/vendor/github.com/c2h5oh/datasize/.gitignore +++ /dev/null @@ -1,24 +0,0 @@ -# Compiled Object files, Static and Dynamic libs (Shared Objects) -*.o -*.a -*.so - -# Folders -_obj -_test - -# 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/github.com/c2h5oh/datasize/.travis.yml b/vendor/github.com/c2h5oh/datasize/.travis.yml deleted file mode 100644 index 204e7008..00000000 --- a/vendor/github.com/c2h5oh/datasize/.travis.yml +++ /dev/null @@ -1,14 +0,0 @@ -sudo: false - -language: go -go: - - 1.4 - - 1.5 - - 1.6 - - 1.7 - - 1.8 - - 1.9 - - tip - -script: - - go test -v diff --git a/vendor/github.com/c2h5oh/datasize/LICENSE b/vendor/github.com/c2h5oh/datasize/LICENSE deleted file mode 100644 index f2ba916e..00000000 --- a/vendor/github.com/c2h5oh/datasize/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -The MIT License (MIT) - -Copyright (c) 2016 Maciej Lisiewski - -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/c2h5oh/datasize/README.md b/vendor/github.com/c2h5oh/datasize/README.md deleted file mode 100644 index ac0cf858..00000000 --- a/vendor/github.com/c2h5oh/datasize/README.md +++ /dev/null @@ -1,77 +0,0 @@ -# datasize [![Build Status](https://travis-ci.org/c2h5oh/datasize.svg?branch=master)](https://travis-ci.org/c2h5oh/datasize) - -Golang helpers for data sizes - -### Constants - -Just like `time` package provides `time.Second`, `time.Day` constants `datasize` provides: - -* `datasize.B` 1 byte -* `datasize.KB` 1 kilobyte -* `datasize.MB` 1 megabyte -* `datasize.GB` 1 gigabyte -* `datasize.TB` 1 terabyte -* `datasize.PB` 1 petabyte -* `datasize.EB` 1 exabyte - -### Helpers - -Just like `time` package provides `duration.Nanoseconds() uint64 `, `duration.Hours() float64` helpers `datasize` has. - -* `ByteSize.Bytes() uint64` -* `ByteSize.Kilobytes() float4` -* `ByteSize.Megabytes() float64` -* `ByteSize.Gigabytes() float64` -* `ByteSize.Terabytes() float64` -* `ByteSize.Petebytes() float64` -* `ByteSize.Exabytes() float64` - -Warning: see limitations at the end of this document about a possible precission loss - -### Parsing strings - -`datasize.ByteSize` implements `TextUnmarshaler` interface and will automatically parse human readable strings into correct values where it is used: - -* `"10 MB"` -> `10* datasize.MB` -* `"10240 g"` -> `10 * datasize.TB` -* `"2000"` -> `2000 * datasize.B` -* `"1tB"` -> `datasize.TB` -* `"5 peta"` -> `5 * datasize.PB` -* `"28 kilobytes"` -> `28 * datasize.KB` -* `"1 gigabyte"` -> `1 * datasize.GB` - -You can also do it manually: - -```go -var v datasize.ByteSize -err := v.UnmarshalText([]byte("100 mb")) -``` - -### Printing - -`Bytesize.String()` uses largest unit allowing an integer value: - -* `(102400 * datasize.MB).String()` -> `"100GB"` -* `(datasize.MB + datasize.KB).String()` -> `"1025KB"` - -Use `%d` format string to get value in bytes without a unit. - -### JSON and other encoding - -Both `TextMarshaler` and `TextUnmarshaler` interfaces are implemented - JSON will just work. Other encoders will work provided they use those interfaces. - -### Human readable - -`ByteSize.HumanReadable()` or `ByteSize.HR()` returns a string with 1-3 digits, followed by 1 decimal place, a space and unit big enough to get 1-3 digits - -* `(102400 * datasize.MB).String()` -> `"100.0 GB"` -* `(datasize.MB + 512 * datasize.KB).String()` -> `"1.5 MB"` - -### Limitations - -* The underlying data type for `data.ByteSize` is `uint64`, so values outside of 0 to 2^64-1 range will overflow -* size helper functions (like `ByteSize.Kilobytes()`) return `float64`, which can't represent all possible values of `uint64` accurately: - * if the returned value is supposed to have no fraction (ie `(10 * datasize.MB).Kilobytes()`) accuracy loss happens when value is more than 2^53 larger than unit: `.Kilobytes()` over 8 petabytes, `.Megabytes()` over 8 exabytes - * if the returned value is supposed to have a fraction (ie `(datasize.PB + datasize.B).Megabytes()`) in addition to the above note accuracy loss may occur in fractional part too - larger integer part leaves fewer bytes to store fractional part, the smaller the remainder vs unit the move bytes are required to store the fractional part -* Parsing a string with `Mb`, `Tb`, etc units will return a syntax error, because capital followed by lower case is commonly used for bits, not bytes -* Parsing a string with value exceeding 2^64-1 bytes will return 2^64-1 and an out of range error diff --git a/vendor/github.com/c2h5oh/datasize/datasize.go b/vendor/github.com/c2h5oh/datasize/datasize.go deleted file mode 100644 index 67547881..00000000 --- a/vendor/github.com/c2h5oh/datasize/datasize.go +++ /dev/null @@ -1,217 +0,0 @@ -package datasize - -import ( - "errors" - "fmt" - "strconv" - "strings" -) - -type ByteSize uint64 - -const ( - B ByteSize = 1 - KB = B << 10 - MB = KB << 10 - GB = MB << 10 - TB = GB << 10 - PB = TB << 10 - EB = PB << 10 - - fnUnmarshalText string = "UnmarshalText" - maxUint64 uint64 = (1 << 64) - 1 - cutoff uint64 = maxUint64 / 10 -) - -var ErrBits = errors.New("unit with capital unit prefix and lower case unit (b) - bits, not bytes ") - -func (b ByteSize) Bytes() uint64 { - return uint64(b) -} - -func (b ByteSize) KBytes() float64 { - v := b / KB - r := b % KB - return float64(v) + float64(r)/float64(KB) -} - -func (b ByteSize) MBytes() float64 { - v := b / MB - r := b % MB - return float64(v) + float64(r)/float64(MB) -} - -func (b ByteSize) GBytes() float64 { - v := b / GB - r := b % GB - return float64(v) + float64(r)/float64(GB) -} - -func (b ByteSize) TBytes() float64 { - v := b / TB - r := b % TB - return float64(v) + float64(r)/float64(TB) -} - -func (b ByteSize) PBytes() float64 { - v := b / PB - r := b % PB - return float64(v) + float64(r)/float64(PB) -} - -func (b ByteSize) EBytes() float64 { - v := b / EB - r := b % EB - return float64(v) + float64(r)/float64(EB) -} - -func (b ByteSize) String() string { - switch { - case b == 0: - return fmt.Sprint("0B") - case b%EB == 0: - return fmt.Sprintf("%dEB", b/EB) - case b%PB == 0: - return fmt.Sprintf("%dPB", b/PB) - case b%TB == 0: - return fmt.Sprintf("%dTB", b/TB) - case b%GB == 0: - return fmt.Sprintf("%dGB", b/GB) - case b%MB == 0: - return fmt.Sprintf("%dMB", b/MB) - case b%KB == 0: - return fmt.Sprintf("%dKB", b/KB) - default: - return fmt.Sprintf("%dB", b) - } -} - -func (b ByteSize) HR() string { - return b.HumanReadable() -} - -func (b ByteSize) HumanReadable() string { - switch { - case b > EB: - return fmt.Sprintf("%.1f EB", b.EBytes()) - case b > PB: - return fmt.Sprintf("%.1f PB", b.PBytes()) - case b > TB: - return fmt.Sprintf("%.1f TB", b.TBytes()) - case b > GB: - return fmt.Sprintf("%.1f GB", b.GBytes()) - case b > MB: - return fmt.Sprintf("%.1f MB", b.MBytes()) - case b > KB: - return fmt.Sprintf("%.1f KB", b.KBytes()) - default: - return fmt.Sprintf("%d B", b) - } -} - -func (b ByteSize) MarshalText() ([]byte, error) { - return []byte(b.String()), nil -} - -func (b *ByteSize) UnmarshalText(t []byte) error { - var val uint64 - var unit string - - // copy for error message - t0 := t - - var c byte - var i int - -ParseLoop: - for i < len(t) { - c = t[i] - switch { - case '0' <= c && c <= '9': - if val > cutoff { - goto Overflow - } - - c = c - '0' - val *= 10 - - if val > val+uint64(c) { - // val+v overflows - goto Overflow - } - val += uint64(c) - i++ - - default: - if i == 0 { - goto SyntaxError - } - break ParseLoop - } - } - - unit = strings.TrimSpace(string(t[i:])) - switch unit { - case "Kb", "Mb", "Gb", "Tb", "Pb", "Eb": - goto BitsError - } - unit = strings.ToLower(unit) - switch unit { - case "", "b", "byte": - // do nothing - already in bytes - - case "k", "kb", "kilo", "kilobyte", "kilobytes": - if val > maxUint64/uint64(KB) { - goto Overflow - } - val *= uint64(KB) - - case "m", "mb", "mega", "megabyte", "megabytes": - if val > maxUint64/uint64(MB) { - goto Overflow - } - val *= uint64(MB) - - case "g", "gb", "giga", "gigabyte", "gigabytes": - if val > maxUint64/uint64(GB) { - goto Overflow - } - val *= uint64(GB) - - case "t", "tb", "tera", "terabyte", "terabytes": - if val > maxUint64/uint64(TB) { - goto Overflow - } - val *= uint64(TB) - - case "p", "pb", "peta", "petabyte", "petabytes": - if val > maxUint64/uint64(PB) { - goto Overflow - } - val *= uint64(PB) - - case "E", "EB", "e", "eb", "eB": - if val > maxUint64/uint64(EB) { - goto Overflow - } - val *= uint64(EB) - - default: - goto SyntaxError - } - - *b = ByteSize(val) - return nil - -Overflow: - *b = ByteSize(maxUint64) - return &strconv.NumError{fnUnmarshalText, string(t0), strconv.ErrRange} - -SyntaxError: - *b = 0 - return &strconv.NumError{fnUnmarshalText, string(t0), strconv.ErrSyntax} - -BitsError: - *b = 0 - return &strconv.NumError{fnUnmarshalText, string(t0), ErrBits} -} diff --git a/vendor/github.com/go-openapi/jsonpointer/.travis.yml b/vendor/github.com/go-openapi/jsonpointer/.travis.yml index 03a22fe0..9aef9184 100644 --- a/vendor/github.com/go-openapi/jsonpointer/.travis.yml +++ b/vendor/github.com/go-openapi/jsonpointer/.travis.yml @@ -1,8 +1,8 @@ after_success: - bash <(curl -s https://codecov.io/bash) go: -- 1.14.x -- 1.15.x +- 1.11.x +- 1.12.x install: - GO111MODULE=off go get -u gotest.tools/gotestsum env: diff --git a/vendor/github.com/go-openapi/jsonpointer/pointer.go b/vendor/github.com/go-openapi/jsonpointer/pointer.go index 7df9853d..b284eb77 100644 --- a/vendor/github.com/go-openapi/jsonpointer/pointer.go +++ b/vendor/github.com/go-openapi/jsonpointer/pointer.go @@ -114,16 +114,16 @@ func getSingleImpl(node interface{}, decodedToken string, nameProvider *swag.Nam rValue := reflect.Indirect(reflect.ValueOf(node)) kind := rValue.Kind() - if rValue.Type().Implements(jsonPointableType) { - r, err := node.(JSONPointable).JSONLookup(decodedToken) - if err != nil { - return nil, kind, err - } - return r, kind, nil - } - switch kind { + case reflect.Struct: + if rValue.Type().Implements(jsonPointableType) { + r, err := node.(JSONPointable).JSONLookup(decodedToken) + if err != nil { + return nil, kind, err + } + return r, kind, nil + } nm, ok := nameProvider.GetGoNameForType(rValue.Type(), decodedToken) if !ok { return nil, kind, fmt.Errorf("object has no field %q", decodedToken) @@ -161,17 +161,17 @@ func getSingleImpl(node interface{}, decodedToken string, nameProvider *swag.Nam func setSingleImpl(node, data interface{}, decodedToken string, nameProvider *swag.NameProvider) error { rValue := reflect.Indirect(reflect.ValueOf(node)) - - if ns, ok := node.(JSONSetable); ok { // pointer impl - return ns.JSONSet(decodedToken, data) - } - - if rValue.Type().Implements(jsonSetableType) { - return node.(JSONSetable).JSONSet(decodedToken, data) - } - switch rValue.Kind() { + case reflect.Struct: + if ns, ok := node.(JSONSetable); ok { // pointer impl + return ns.JSONSet(decodedToken, data) + } + + if rValue.Type().Implements(jsonSetableType) { + return node.(JSONSetable).JSONSet(decodedToken, data) + } + nm, ok := nameProvider.GetGoNameForType(rValue.Type(), decodedToken) if !ok { return fmt.Errorf("object has no field %q", decodedToken) @@ -270,22 +270,22 @@ func (p *Pointer) set(node, data interface{}, nameProvider *swag.NameProvider) e rValue := reflect.Indirect(reflect.ValueOf(node)) kind := rValue.Kind() - if rValue.Type().Implements(jsonPointableType) { - r, err := node.(JSONPointable).JSONLookup(decodedToken) - if err != nil { - return err - } - fld := reflect.ValueOf(r) - if fld.CanAddr() && fld.Kind() != reflect.Interface && fld.Kind() != reflect.Map && fld.Kind() != reflect.Slice && fld.Kind() != reflect.Ptr { - node = fld.Addr().Interface() + switch kind { + + case reflect.Struct: + if rValue.Type().Implements(jsonPointableType) { + r, err := node.(JSONPointable).JSONLookup(decodedToken) + if err != nil { + return err + } + fld := reflect.ValueOf(r) + if fld.CanAddr() && fld.Kind() != reflect.Interface && fld.Kind() != reflect.Map && fld.Kind() != reflect.Slice && fld.Kind() != reflect.Ptr { + node = fld.Addr().Interface() + continue + } + node = r continue } - node = r - continue - } - - switch kind { - case reflect.Struct: nm, ok := nameProvider.GetGoNameForType(rValue.Type(), decodedToken) if !ok { return fmt.Errorf("object has no field %q", decodedToken) diff --git a/vendor/github.com/go-openapi/jsonreference/.golangci.yml b/vendor/github.com/go-openapi/jsonreference/.golangci.yml deleted file mode 100644 index f9381aee..00000000 --- a/vendor/github.com/go-openapi/jsonreference/.golangci.yml +++ /dev/null @@ -1,41 +0,0 @@ -linters-settings: - govet: - check-shadowing: true - golint: - min-confidence: 0 - gocyclo: - min-complexity: 30 - maligned: - suggest-new: true - dupl: - threshold: 100 - goconst: - min-len: 2 - min-occurrences: 4 -linters: - enable-all: true - disable: - - maligned - - lll - - gochecknoglobals - - godox - - gocognit - - whitespace - - wsl - - funlen - - gochecknoglobals - - gochecknoinits - - scopelint - - wrapcheck - - exhaustivestruct - - exhaustive - - nlreturn - - testpackage - - gci - - gofumpt - - goerr113 - - gomnd - - tparallel - - nestif - - godot - - errorlint diff --git a/vendor/github.com/go-openapi/jsonreference/.travis.yml b/vendor/github.com/go-openapi/jsonreference/.travis.yml index 05482f4b..40b90757 100644 --- a/vendor/github.com/go-openapi/jsonreference/.travis.yml +++ b/vendor/github.com/go-openapi/jsonreference/.travis.yml @@ -1,19 +1,10 @@ after_success: - bash <(curl -s https://codecov.io/bash) go: -- 1.14.x -- 1.x +- 1.11.x +- 1.12.x install: -- go get gotest.tools/gotestsum -jobs: - include: - # include linting job, but only for latest go version and amd64 arch - - go: 1.x - arch: amd64 - install: - go get github.com/golangci/golangci-lint/cmd/golangci-lint - script: - - golangci-lint run --new-from-rev master +- GO111MODULE=off go get -u gotest.tools/gotestsum env: - GO111MODULE=on language: go diff --git a/vendor/github.com/go-openapi/jsonreference/README.md b/vendor/github.com/go-openapi/jsonreference/README.md index b94753aa..66345f4c 100644 --- a/vendor/github.com/go-openapi/jsonreference/README.md +++ b/vendor/github.com/go-openapi/jsonreference/README.md @@ -4,7 +4,7 @@ An implementation of JSON Reference - Go language ## Status -Feature complete. Stable API +Work in progress ( 90% done ) ## Dependencies https://github.com/go-openapi/jsonpointer diff --git a/vendor/github.com/go-openapi/jsonreference/go.mod b/vendor/github.com/go-openapi/jsonreference/go.mod index e6c2ec4d..aff1d016 100644 --- a/vendor/github.com/go-openapi/jsonreference/go.mod +++ b/vendor/github.com/go-openapi/jsonreference/go.mod @@ -6,7 +6,7 @@ require ( github.com/go-openapi/jsonpointer v0.19.3 github.com/stretchr/testify v1.3.0 golang.org/x/net v0.0.0-20190827160401-ba9fcec4b297 // indirect - golang.org/x/text v0.3.3 // indirect + golang.org/x/text v0.3.2 // indirect ) go 1.13 diff --git a/vendor/github.com/go-openapi/jsonreference/go.sum b/vendor/github.com/go-openapi/jsonreference/go.sum index b37f873e..c7ceab58 100644 --- a/vendor/github.com/go-openapi/jsonreference/go.sum +++ b/vendor/github.com/go-openapi/jsonreference/go.sum @@ -5,8 +5,12 @@ github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578/go.mod h1:uGdko 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/go-openapi/jsonpointer v0.19.2 h1:A9+F4Dc/MCNB5jibxf6rRvOvR/iFgQdyNx9eIhnGqq0= +github.com/go-openapi/jsonpointer v0.19.2/go.mod h1:3akKfEdA7DF1sugOqz1dVQHBcuDBPKZGEoHC/NkiQRg= github.com/go-openapi/jsonpointer v0.19.3 h1:gihV7YNZK1iK6Tgwwsxo2rJbD1GTbdm72325Bq8FI3w= github.com/go-openapi/jsonpointer v0.19.3/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= +github.com/go-openapi/swag v0.19.2 h1:jvO6bCMBEilGwMfHhrd61zIID4oIFdwb76V17SM88dE= +github.com/go-openapi/swag v0.19.2/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= github.com/go-openapi/swag v0.19.5 h1:lTz6Ys4CmqqCQmZPBlbQENR1/GucA2bzYTE12Pw4tFY= github.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= github.com/kr/pretty v0.1.0 h1:L/CwN0zerZDmRFUapSPitk6f+Q3+0za1rQkzVuMiMFI= @@ -24,12 +28,14 @@ github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+ 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/net v0.0.0-20190613194153-d28f0bde5980 h1:dfGZHvZk057jK2MCeWus/TowKpJ8y4AmooUzdBSR9GU= +golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190827160401-ba9fcec4b297 h1:k7pJ2yAPLPgbskkFdhRCsA77k2fySZ1zf2zCjvQCiIM= golang.org/x/net v0.0.0-20190827160401-ba9fcec4b297/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/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/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-20180628173108-788fd7840127 h1:qIbj1fsPNlZgppZ+VLlY7N33q108Sa+fhmuc+sWQYwY= diff --git a/vendor/github.com/go-openapi/spec/contact_info.go b/vendor/github.com/go-openapi/spec/contact_info.go index f9bf42e8..f285970a 100644 --- a/vendor/github.com/go-openapi/spec/contact_info.go +++ b/vendor/github.com/go-openapi/spec/contact_info.go @@ -14,41 +14,11 @@ package spec -import ( - "encoding/json" - - "github.com/go-openapi/swag" -) - // ContactInfo contact information for the exposed API. // // For more information: http://goo.gl/8us55a#contactObject type ContactInfo struct { - ContactInfoProps - VendorExtensible -} - -type ContactInfoProps struct { Name string `json:"name,omitempty"` URL string `json:"url,omitempty"` Email string `json:"email,omitempty"` } - -func (c *ContactInfo) UnmarshalJSON(data []byte) error { - if err := json.Unmarshal(data, &c.ContactInfoProps); err != nil { - return err - } - return json.Unmarshal(data, &c.VendorExtensible) -} - -func (c ContactInfo) MarshalJSON() ([]byte, error) { - b1, err := json.Marshal(c.ContactInfoProps) - if err != nil { - return nil, err - } - b2, err := json.Marshal(c.VendorExtensible) - if err != nil { - return nil, err - } - return swag.ConcatJSON(b1, b2), nil -} diff --git a/vendor/github.com/go-openapi/spec/license.go b/vendor/github.com/go-openapi/spec/license.go index e1529b40..f20961b4 100644 --- a/vendor/github.com/go-openapi/spec/license.go +++ b/vendor/github.com/go-openapi/spec/license.go @@ -14,40 +14,10 @@ package spec -import ( - "encoding/json" - - "github.com/go-openapi/swag" -) - // License information for the exposed API. // // For more information: http://goo.gl/8us55a#licenseObject type License struct { - LicenseProps - VendorExtensible -} - -type LicenseProps struct { Name string `json:"name,omitempty"` URL string `json:"url,omitempty"` } - -func (l *License) UnmarshalJSON(data []byte) error { - if err := json.Unmarshal(data, &l.LicenseProps); err != nil { - return err - } - return json.Unmarshal(data, &l.VendorExtensible) -} - -func (l License) MarshalJSON() ([]byte, error) { - b1, err := json.Marshal(l.LicenseProps) - if err != nil { - return nil, err - } - b2, err := json.Marshal(l.VendorExtensible) - if err != nil { - return nil, err - } - return swag.ConcatJSON(b1, b2), nil -} diff --git a/vendor/github.com/go-openapi/swag/.golangci.yml b/vendor/github.com/go-openapi/swag/.golangci.yml index 842ac1c0..625c3d6a 100644 --- a/vendor/github.com/go-openapi/swag/.golangci.yml +++ b/vendor/github.com/go-openapi/swag/.golangci.yml @@ -20,22 +20,3 @@ linters: - lll - gochecknoinits - gochecknoglobals - - nlreturn - - testpackage - - wrapcheck - - gomnd - - exhaustive - - exhaustivestruct - - goerr113 - - wsl - - whitespace - - gofumpt - - godot - - nestif - - godox - - funlen - - gci - - gocognit - - paralleltest - - thelper - - ifshort diff --git a/vendor/github.com/go-openapi/swag/.travis.yml b/vendor/github.com/go-openapi/swag/.travis.yml index fc25a887..aa26d876 100644 --- a/vendor/github.com/go-openapi/swag/.travis.yml +++ b/vendor/github.com/go-openapi/swag/.travis.yml @@ -1,34 +1,12 @@ after_success: - bash <(curl -s https://codecov.io/bash) go: -- 1.14.x -- 1.x -arch: -- amd64 -jobs: - include: - # include arch ppc, but only for latest go version - skip testing for race - - go: 1.x - arch: ppc64le - install: ~ - script: - - go test -v - - #- go: 1.x - # arch: arm - # install: ~ - # script: - # - go test -v - - # include linting job, but only for latest go version and amd64 arch - - go: 1.x - arch: amd64 - install: - go get github.com/golangci/golangci-lint/cmd/golangci-lint - script: - - golangci-lint run --new-from-rev master +- 1.11.x +- 1.12.x install: - GO111MODULE=off go get -u gotest.tools/gotestsum +env: +- GO111MODULE=on language: go notifications: slack: diff --git a/vendor/github.com/go-openapi/swag/README.md b/vendor/github.com/go-openapi/swag/README.md index 217f6fa5..eb60ae80 100644 --- a/vendor/github.com/go-openapi/swag/README.md +++ b/vendor/github.com/go-openapi/swag/README.md @@ -2,6 +2,7 @@ [![license](http://img.shields.io/badge/license-Apache%20v2-orange.svg)](https://raw.githubusercontent.com/go-openapi/swag/master/LICENSE) [![GoDoc](https://godoc.org/github.com/go-openapi/swag?status.svg)](http://godoc.org/github.com/go-openapi/swag) +[![GolangCI](https://golangci.com/badges/github.com/go-openapi/swag.svg)](https://golangci.com) [![Go Report Card](https://goreportcard.com/badge/github.com/go-openapi/swag)](https://goreportcard.com/report/github.com/go-openapi/swag) Contains a bunch of helper functions for go-openapi and go-swagger projects. diff --git a/vendor/github.com/go-openapi/swag/convert.go b/vendor/github.com/go-openapi/swag/convert.go index fc085aeb..7da35c31 100644 --- a/vendor/github.com/go-openapi/swag/convert.go +++ b/vendor/github.com/go-openapi/swag/convert.go @@ -88,7 +88,7 @@ func ConvertFloat64(str string) (float64, error) { return strconv.ParseFloat(str, 64) } -// ConvertInt8 turn a string into an int8 +// ConvertInt8 turn a string into int8 boolean func ConvertInt8(str string) (int8, error) { i, err := strconv.ParseInt(str, 10, 8) if err != nil { @@ -97,7 +97,7 @@ func ConvertInt8(str string) (int8, error) { return int8(i), nil } -// ConvertInt16 turn a string into an int16 +// ConvertInt16 turn a string into a int16 func ConvertInt16(str string) (int16, error) { i, err := strconv.ParseInt(str, 10, 16) if err != nil { @@ -106,7 +106,7 @@ func ConvertInt16(str string) (int16, error) { return int16(i), nil } -// ConvertInt32 turn a string into an int32 +// ConvertInt32 turn a string into a int32 func ConvertInt32(str string) (int32, error) { i, err := strconv.ParseInt(str, 10, 32) if err != nil { @@ -115,12 +115,12 @@ func ConvertInt32(str string) (int32, error) { return int32(i), nil } -// ConvertInt64 turn a string into an int64 +// ConvertInt64 turn a string into a int64 func ConvertInt64(str string) (int64, error) { return strconv.ParseInt(str, 10, 64) } -// ConvertUint8 turn a string into an uint8 +// ConvertUint8 turn a string into a uint8 func ConvertUint8(str string) (uint8, error) { i, err := strconv.ParseUint(str, 10, 8) if err != nil { @@ -129,7 +129,7 @@ func ConvertUint8(str string) (uint8, error) { return uint8(i), nil } -// ConvertUint16 turn a string into an uint16 +// ConvertUint16 turn a string into a uint16 func ConvertUint16(str string) (uint16, error) { i, err := strconv.ParseUint(str, 10, 16) if err != nil { @@ -138,7 +138,7 @@ func ConvertUint16(str string) (uint16, error) { return uint16(i), nil } -// ConvertUint32 turn a string into an uint32 +// ConvertUint32 turn a string into a uint32 func ConvertUint32(str string) (uint32, error) { i, err := strconv.ParseUint(str, 10, 32) if err != nil { @@ -147,7 +147,7 @@ func ConvertUint32(str string) (uint32, error) { return uint32(i), nil } -// ConvertUint64 turn a string into an uint64 +// ConvertUint64 turn a string into a uint64 func ConvertUint64(str string) (uint64, error) { return strconv.ParseUint(str, 10, 64) } diff --git a/vendor/github.com/go-openapi/swag/convert_types.go b/vendor/github.com/go-openapi/swag/convert_types.go index c49cc473..c95e4e78 100644 --- a/vendor/github.com/go-openapi/swag/convert_types.go +++ b/vendor/github.com/go-openapi/swag/convert_types.go @@ -181,12 +181,12 @@ func IntValueMap(src map[string]*int) map[string]int { return dst } -// Int32 returns a pointer to of the int32 value passed in. +// Int32 returns a pointer to of the int64 value passed in. func Int32(v int32) *int32 { return &v } -// Int32Value returns the value of the int32 pointer passed in or +// Int32Value returns the value of the int64 pointer passed in or // 0 if the pointer is nil. func Int32Value(v *int32) int32 { if v != nil { @@ -195,7 +195,7 @@ func Int32Value(v *int32) int32 { return 0 } -// Int32Slice converts a slice of int32 values into a slice of +// Int32Slice converts a slice of int64 values into a slice of // int32 pointers func Int32Slice(src []int32) []*int32 { dst := make([]*int32, len(src)) @@ -299,80 +299,13 @@ func Int64ValueMap(src map[string]*int64) map[string]int64 { return dst } -// Uint16 returns a pointer to of 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 -} - -// Uint returns a pointer to of the uint value passed in. +// Uint returns a pouinter to of 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. +// UintValue returns the value of the uint pouinter passed in or +// 0 if the pouinter is nil. func UintValue(v *uint) uint { if v != nil { return *v @@ -380,8 +313,8 @@ func UintValue(v *uint) uint { return 0 } -// UintSlice converts a slice of uint values into a slice of -// uint pointers +// UintSlice converts a slice of uint values uinto a slice of +// uint pouinters func UintSlice(src []uint) []*uint { dst := make([]*uint, len(src)) for i := 0; i < len(src); i++ { @@ -390,7 +323,7 @@ func UintSlice(src []uint) []*uint { return dst } -// UintValueSlice converts a slice of uint pointers into a slice of +// UintValueSlice converts a slice of uint pouinters uinto a slice of // uint values func UintValueSlice(src []*uint) []uint { dst := make([]uint, len(src)) @@ -402,8 +335,8 @@ func UintValueSlice(src []*uint) []uint { return dst } -// UintMap converts a string map of uint values into a string -// map of uint pointers +// UintMap converts a string map of uint values uinto a string +// map of uint pouinters func UintMap(src map[string]uint) map[string]*uint { dst := make(map[string]*uint) for k, val := range src { @@ -413,7 +346,7 @@ func UintMap(src map[string]uint) map[string]*uint { return dst } -// UintValueMap converts a string map of uint pointers into a string +// UintValueMap converts a string map of uint pouinters uinto a string // map of uint values func UintValueMap(src map[string]*uint) map[string]uint { dst := make(map[string]uint) @@ -425,13 +358,13 @@ func UintValueMap(src map[string]*uint) map[string]uint { return dst } -// Uint32 returns a pointer to of the uint32 value passed in. +// Uint32 returns a pouinter to of the uint64 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. +// Uint32Value returns the value of the uint64 pouinter passed in or +// 0 if the pouinter is nil. func Uint32Value(v *uint32) uint32 { if v != nil { return *v @@ -439,8 +372,8 @@ func Uint32Value(v *uint32) uint32 { return 0 } -// Uint32Slice converts a slice of uint32 values into a slice of -// uint32 pointers +// Uint32Slice converts a slice of uint64 values uinto a slice of +// uint32 pouinters func Uint32Slice(src []uint32) []*uint32 { dst := make([]*uint32, len(src)) for i := 0; i < len(src); i++ { @@ -449,7 +382,7 @@ func Uint32Slice(src []uint32) []*uint32 { return dst } -// Uint32ValueSlice converts a slice of uint32 pointers into a slice of +// Uint32ValueSlice converts a slice of uint32 pouinters uinto a slice of // uint32 values func Uint32ValueSlice(src []*uint32) []uint32 { dst := make([]uint32, len(src)) @@ -461,8 +394,8 @@ func Uint32ValueSlice(src []*uint32) []uint32 { return dst } -// Uint32Map converts a string map of uint32 values into a string -// map of uint32 pointers +// Uint32Map converts a string map of uint32 values uinto a string +// map of uint32 pouinters func Uint32Map(src map[string]uint32) map[string]*uint32 { dst := make(map[string]*uint32) for k, val := range src { @@ -472,7 +405,7 @@ func Uint32Map(src map[string]uint32) map[string]*uint32 { return dst } -// Uint32ValueMap converts a string map of uint32 pointers into a string +// Uint32ValueMap converts a string map of uint32 pouinters uinto a string // map of uint32 values func Uint32ValueMap(src map[string]*uint32) map[string]uint32 { dst := make(map[string]uint32) @@ -484,13 +417,13 @@ func Uint32ValueMap(src map[string]*uint32) map[string]uint32 { return dst } -// Uint64 returns a pointer to of the uint64 value passed in. +// Uint64 returns a pouinter to of 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. +// Uint64Value returns the value of the uint64 pouinter passed in or +// 0 if the pouinter is nil. func Uint64Value(v *uint64) uint64 { if v != nil { return *v @@ -498,8 +431,8 @@ func Uint64Value(v *uint64) uint64 { return 0 } -// Uint64Slice converts a slice of uint64 values into a slice of -// uint64 pointers +// Uint64Slice converts a slice of uint64 values uinto a slice of +// uint64 pouinters func Uint64Slice(src []uint64) []*uint64 { dst := make([]*uint64, len(src)) for i := 0; i < len(src); i++ { @@ -508,7 +441,7 @@ func Uint64Slice(src []uint64) []*uint64 { return dst } -// Uint64ValueSlice converts a slice of uint64 pointers into a slice of +// Uint64ValueSlice converts a slice of uint64 pouinters uinto a slice of // uint64 values func Uint64ValueSlice(src []*uint64) []uint64 { dst := make([]uint64, len(src)) @@ -520,8 +453,8 @@ func Uint64ValueSlice(src []*uint64) []uint64 { return dst } -// Uint64Map converts a string map of uint64 values into a string -// map of uint64 pointers +// Uint64Map converts a string map of uint64 values uinto a string +// map of uint64 pouinters func Uint64Map(src map[string]uint64) map[string]*uint64 { dst := make(map[string]*uint64) for k, val := range src { @@ -531,7 +464,7 @@ func Uint64Map(src map[string]uint64) map[string]*uint64 { return dst } -// Uint64ValueMap converts a string map of uint64 pointers into a string +// Uint64ValueMap converts a string map of uint64 pouinters uinto a string // map of uint64 values func Uint64ValueMap(src map[string]*uint64) map[string]uint64 { dst := make(map[string]uint64) @@ -543,74 +476,6 @@ func Uint64ValueMap(src map[string]*uint64) map[string]uint64 { return dst } -// Float32 returns a pointer to of 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 of the float64 value passed in. func Float64(v float64) *float64 { return &v diff --git a/vendor/github.com/go-openapi/swag/go.mod b/vendor/github.com/go-openapi/swag/go.mod index fb29b65b..15bbb082 100644 --- a/vendor/github.com/go-openapi/swag/go.mod +++ b/vendor/github.com/go-openapi/swag/go.mod @@ -2,17 +2,13 @@ module github.com/go-openapi/swag require ( github.com/davecgh/go-spew v1.1.1 // indirect - github.com/kr/text v0.2.0 // indirect - github.com/mailru/easyjson v0.7.6 - github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e // indirect - github.com/stretchr/testify v1.6.1 - gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f // indirect - gopkg.in/yaml.v2 v2.4.0 - gopkg.in/yaml.v3 v3.0.0-20200615113413-eeeca48fe776 // indirect + github.com/kr/pretty v0.1.0 // indirect + github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63 + github.com/stretchr/testify v1.3.0 + gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 // indirect + gopkg.in/yaml.v2 v2.2.2 ) replace github.com/golang/lint => golang.org/x/lint v0.0.0-20190409202823-959b441ac422 replace sourcegraph.com/sourcegraph/go-diff => github.com/sourcegraph/go-diff v0.5.1 - -go 1.11 diff --git a/vendor/github.com/go-openapi/swag/go.sum b/vendor/github.com/go-openapi/swag/go.sum index a45da809..33469f54 100644 --- a/vendor/github.com/go-openapi/swag/go.sum +++ b/vendor/github.com/go-openapi/swag/go.sum @@ -1,29 +1,20 @@ -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/josharian/intern v1.0.0 h1:vlS4z54oSdjm0bgjRigI+G1HpF+tI+9rE5LLzOg8HmY= -github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y= +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/mailru/easyjson v0.7.6 h1:8yTIVnZgCoiM1TgqoeTl+LfU5Jg6/xL3QhGQnimLYnA= -github.com/mailru/easyjson v0.7.6/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= -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/mailru/easyjson v0.0.0-20190614124828-94de47d64c63 h1:nTT4s92Dgz2HlrB2NaMgvlfqHH39OgMhA7z3PK7PGD4= +github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= 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 h1:4G4v2dO3VZwixGIRoQ5Lfboy6nUhCyYzaqnIAPPhYs4= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/testify v1.6.1 h1:hDPOHmpOpP40lSULcqw7IrRb/u7w6RpDC9399XyoNd0= -github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.3.0 h1:TivCn/peBQ7UY8ooIcPgZFpTNSz0Q2U6UrFlUfqbe0Q= +github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/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/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= -gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= -gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gopkg.in/yaml.v3 v3.0.0-20200615113413-eeeca48fe776 h1:tQIYjPdBoyREyB9XMu+nnTclpTYkz2zFM+lzLJFO4gQ= -gopkg.in/yaml.v3 v3.0.0-20200615113413-eeeca48fe776/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +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/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/go-openapi/swag/json.go b/vendor/github.com/go-openapi/swag/json.go index 7e9902ca..edf93d84 100644 --- a/vendor/github.com/go-openapi/swag/json.go +++ b/vendor/github.com/go-openapi/swag/json.go @@ -51,7 +51,7 @@ type ejUnmarshaler interface { UnmarshalEasyJSON(w *jlexer.Lexer) } -// WriteJSON writes json data, prefers finding an appropriate interface to short-circuit the marshaler +// WriteJSON writes json data, prefers finding an appropriate interface to short-circuit the marshaller // so it takes the fastest option available. func WriteJSON(data interface{}) ([]byte, error) { if d, ok := data.(ejMarshaler); ok { @@ -65,8 +65,8 @@ func WriteJSON(data interface{}) ([]byte, error) { return json.Marshal(data) } -// ReadJSON reads json data, prefers finding an appropriate interface to short-circuit the unmarshaler -// so it takes the fastest option available +// ReadJSON reads json data, prefers finding an appropriate interface to short-circuit the unmarshaller +// so it takes the fastes option available func ReadJSON(data []byte, value interface{}) error { trimmedData := bytes.Trim(data, "\x00") if d, ok := value.(ejUnmarshaler); ok { @@ -189,7 +189,7 @@ func FromDynamicJSON(data, target interface{}) error { return json.Unmarshal(b, target) } -// NameProvider represents an object capable of translating from go property names +// NameProvider represents an object capabale of translating from go property names // to json property names // This type is thread-safe. type NameProvider struct { diff --git a/vendor/github.com/go-openapi/swag/loading.go b/vendor/github.com/go-openapi/swag/loading.go index 9a604097..70f4fb36 100644 --- a/vendor/github.com/go-openapi/swag/loading.go +++ b/vendor/github.com/go-openapi/swag/loading.go @@ -19,9 +19,7 @@ import ( "io/ioutil" "log" "net/http" - "net/url" "path/filepath" - "runtime" "strings" "time" ) @@ -29,15 +27,6 @@ import ( // LoadHTTPTimeout the default timeout for load requests var LoadHTTPTimeout = 30 * time.Second -// LoadHTTPBasicAuthUsername the username to use when load requests require basic auth -var LoadHTTPBasicAuthUsername = "" - -// LoadHTTPBasicAuthPassword the password to use when load requests require basic auth -var LoadHTTPBasicAuthPassword = "" - -// LoadHTTPCustomHeaders an optional collection of custom HTTP headers for load requests -var LoadHTTPCustomHeaders = map[string]string{} - // LoadFromFileOrHTTP loads the bytes from a file or a remote http server based on the path passed in func LoadFromFileOrHTTP(path string) ([]byte, error) { return LoadStrategy(path, ioutil.ReadFile, loadHTTPBytes(LoadHTTPTimeout))(path) @@ -59,26 +48,6 @@ func LoadStrategy(path string, local, remote func(string) ([]byte, error)) func( if err != nil { return nil, err } - - if strings.HasPrefix(pth, `file://`) { - if runtime.GOOS == "windows" { - // support for canonical file URIs on windows. - // Zero tolerance here for dodgy URIs. - u, _ := url.Parse(upth) - if u.Host != "" { - // assume UNC name (volume share) - // file://host/share/folder\... ==> \\host\share\path\folder - // NOTE: UNC port not yet supported - upth = strings.Join([]string{`\`, u.Host, u.Path}, `\`) - } else { - // file:///c:/folder/... ==> just remove the leading slash - upth = strings.TrimPrefix(upth, `file:///`) - } - } else { - upth = strings.TrimPrefix(upth, `file://`) - } - } - return local(filepath.FromSlash(upth)) } } @@ -86,19 +55,10 @@ func LoadStrategy(path string, local, remote func(string) ([]byte, error)) func( func loadHTTPBytes(timeout time.Duration) func(path string) ([]byte, error) { return func(path string) ([]byte, error) { client := &http.Client{Timeout: timeout} - req, err := http.NewRequest("GET", path, nil) // nolint: noctx + req, err := http.NewRequest("GET", path, nil) if err != nil { return nil, err } - - if LoadHTTPBasicAuthUsername != "" && LoadHTTPBasicAuthPassword != "" { - req.SetBasicAuth(LoadHTTPBasicAuthUsername, LoadHTTPBasicAuthPassword) - } - - for key, val := range LoadHTTPCustomHeaders { - req.Header.Set(key, val) - } - resp, err := client.Do(req) defer func() { if resp != nil { diff --git a/vendor/github.com/go-openapi/swag/util.go b/vendor/github.com/go-openapi/swag/util.go index 193702f2..9eac16af 100644 --- a/vendor/github.com/go-openapi/swag/util.go +++ b/vendor/github.com/go-openapi/swag/util.go @@ -31,7 +31,7 @@ var isInitialism func(string) bool // GoNamePrefixFunc sets an optional rule to prefix go names // which do not start with a letter. // -// e.g. to help convert "123" into "{prefix}123" +// e.g. to help converting "123" into "{prefix}123" // // The default is to prefix with "X" var GoNamePrefixFunc func(string) string @@ -91,7 +91,7 @@ func init() { } const ( - // collectionFormatComma = "csv" + //collectionFormatComma = "csv" collectionFormatSpace = "ssv" collectionFormatTab = "tsv" collectionFormatPipe = "pipes" @@ -370,7 +370,7 @@ func IsZero(data interface{}) bool { // AddInitialisms add additional initialisms func AddInitialisms(words ...string) { for _, word := range words { - // commonInitialisms[upper(word)] = true + //commonInitialisms[upper(word)] = true commonInitialisms.add(upper(word)) } // sort again diff --git a/vendor/github.com/google/licenseclassifier/.travis.yml b/vendor/github.com/google/licenseclassifier/.travis.yml deleted file mode 100644 index d14af240..00000000 --- a/vendor/github.com/google/licenseclassifier/.travis.yml +++ /dev/null @@ -1,16 +0,0 @@ -sudo: false -language: go -go: - - "1.10" - - "1.11" - - "1.12" -matrix: - allow_failures: - - go: master - fast_finish: true -script: - - go get -t -v ./... - - diff -u <(echo -n) <(gofmt -d -s .) - - go generate -x ./... && git diff --exit-code; code=$?; git checkout -- .; (exit $code) # Check that go generate ./... produces a zero diff; clean up any changes afterwards. - - go vet . - - go test -v -race ./... diff --git a/vendor/github.com/google/licenseclassifier/CHANGELOG b/vendor/github.com/google/licenseclassifier/CHANGELOG deleted file mode 100644 index 00f599a9..00000000 --- a/vendor/github.com/google/licenseclassifier/CHANGELOG +++ /dev/null @@ -1,14 +0,0 @@ -# Change Log -# All notable changes to this project will be documented in this file. -# This project adheres to [Semantic Versioning](http://semver.org/). - -## [0.1.0] UNRELEASED -### Init -- Initial development. -### Changed -- Create a database of forbidden licenses to make matching just forbidden - licenses quicker. -- Remove non-words from the license texts. It makes the matching more precise. - This subsumes what the "remove common prefix" and a few other passes did. -- Remove the "lattice" structure in favor of a simpler and smaller list of - substrings. This gives us a tremendous speed increase of up to 2x. diff --git a/vendor/github.com/google/licenseclassifier/CONTRIBUTING.md b/vendor/github.com/google/licenseclassifier/CONTRIBUTING.md deleted file mode 100644 index 143bfd2d..00000000 --- a/vendor/github.com/google/licenseclassifier/CONTRIBUTING.md +++ /dev/null @@ -1,24 +0,0 @@ -# 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/ diff --git a/vendor/github.com/google/licenseclassifier/LICENSE b/vendor/github.com/google/licenseclassifier/LICENSE deleted file mode 100644 index d6456956..00000000 --- a/vendor/github.com/google/licenseclassifier/LICENSE +++ /dev/null @@ -1,202 +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/google/licenseclassifier/README.md b/vendor/github.com/google/licenseclassifier/README.md deleted file mode 100644 index 902c1509..00000000 --- a/vendor/github.com/google/licenseclassifier/README.md +++ /dev/null @@ -1,66 +0,0 @@ -# License Classifier - -[![Build status](https://travis-ci.org/google/licenseclassifier.svg?branch=master)](https://travis-ci.org/google/licenseclassifier) - -## Introduction - -The license classifier is a library and set of tools that can analyze text to -determine what type of license it contains. It searches for license texts in a -file and compares them to an archive of known licenses. These files could be, -e.g., `LICENSE` files with a single or multiple licenses in it, or source code -files with the license text in a comment. - -A "confidence level" is associated with each result indicating how close the -match was. A confidence level of `1.0` indicates an exact match, while a -confidence level of `0.0` indicates that no license was able to match the text. - -## Adding a new license - -Adding a new license is straight-forward: - -1. Create a file in `licenses/`. - - * The filename should be the name of the license or its abbreviation. If - the license is an Open Source license, use the appropriate identifier - specified at https://spdx.org/licenses/. - * If the license is the "header" version of the license, append the suffix - "`.header`" to it. See `licenses/README.md` for more details. - -2. Add the license name to the list in `license_type.go`. - -3. Regenerate the `licenses.db` file by running the license serializer: - - ```shell - $ license_serializer -output licenseclassifier/licenses - ``` - -4. Create and run appropriate tests to verify that the license is indeed - present. - -## Tools - -### Identify license - -`identify_license` is a command line tool that can identify the license(s) -within a file. - -```shell -$ identify_license LICENSE -LICENSE: GPL-2.0 (confidence: 1, offset: 0, extent: 14794) -LICENSE: LGPL-2.1 (confidence: 1, offset: 18366, extent: 23829) -LICENSE: MIT (confidence: 1, offset: 17255, extent: 1059) -``` - -### License serializer - -The `license_serializer` tool regenerates the `licenses.db` archive. The archive -contains preprocessed license texts for quicker comparisons against unknown -texts. - -```shell -$ license_serializer -output licenseclassifier/licenses -``` - ----- -This is not an official Google product (experimental or otherwise), it is just -code that happens to be owned by Google. diff --git a/vendor/github.com/google/licenseclassifier/classifier.go b/vendor/github.com/google/licenseclassifier/classifier.go deleted file mode 100644 index ff41cf47..00000000 --- a/vendor/github.com/google/licenseclassifier/classifier.go +++ /dev/null @@ -1,472 +0,0 @@ -// Copyright 2017 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 licenseclassifier provides methods to identify the open source -// license that most closely matches an unknown license. -package licenseclassifier - -import ( - "archive/tar" - "bytes" - "compress/gzip" - "fmt" - "html" - "io" - "math" - "regexp" - "sort" - "strings" - "sync" - "unicode" - - "github.com/google/licenseclassifier/stringclassifier" - "github.com/google/licenseclassifier/stringclassifier/searchset" -) - -// DefaultConfidenceThreshold is the minimum confidence percentage we're willing to accept in order -// to say that a match is good. -const DefaultConfidenceThreshold = 0.80 - -var ( - // Normalizers is a list of functions that get applied to the strings - // before they are registered with the string classifier. - Normalizers = []stringclassifier.NormalizeFunc{ - html.UnescapeString, - removeShebangLine, - RemoveNonWords, - NormalizeEquivalentWords, - NormalizePunctuation, - strings.ToLower, - removeIgnorableTexts, - stringclassifier.FlattenWhitespace, - strings.TrimSpace, - } - - // commonLicenseWords are words that are common to all known licenses. - // If an unknown text doesn't have at least one of these, then we can - // ignore it. - commonLicenseWords = []*regexp.Regexp{ - regexp.MustCompile(`(?i)\bcode\b`), - regexp.MustCompile(`(?i)\blicense\b`), - regexp.MustCompile(`(?i)\boriginal\b`), - regexp.MustCompile(`(?i)\brights\b`), - regexp.MustCompile(`(?i)\bsoftware\b`), - regexp.MustCompile(`(?i)\bterms\b`), - regexp.MustCompile(`(?i)\bversion\b`), - regexp.MustCompile(`(?i)\bwork\b`), - } -) - -// License is a classifier pre-loaded with known open source licenses. -type License struct { - c *stringclassifier.Classifier - - // Threshold is the lowest confidence percentage acceptable for the - // classifier. - Threshold float64 - - // archive is a function that must return the contents of the license archive. - // When archive is nil, ReadLicenseFile(LicenseFile) is used to retrieve the - // contents. - archive func() ([]byte, error) -} - -// OptionFunc set options on a License struct. -type OptionFunc func(l *License) error - -// Archive is an OptionFunc to specify the location of the license archive file. -func Archive(f string) OptionFunc { - return func(l *License) error { - l.archive = func() ([]byte, error) { return ReadLicenseFile(f) } - return nil - } -} - -// ArchiveBytes is an OptionFunc that provides the contents of the license archive file. -// The caller must not overwrite the contents of b as it is not copied. -func ArchiveBytes(b []byte) OptionFunc { - return func(l *License) error { - l.archive = func() ([]byte, error) { return b, nil } - return nil - } -} - -// ArchiveFunc is an OptionFunc that provides a function that must return the contents -// of the license archive file. -func ArchiveFunc(f func() ([]byte, error)) OptionFunc { - return func(l *License) error { - l.archive = f - return nil - } -} - -// New creates a license classifier and pre-loads it with known open source licenses. -func New(threshold float64, options ...OptionFunc) (*License, error) { - classifier := &License{ - c: stringclassifier.New(threshold, Normalizers...), - Threshold: threshold, - } - - for _, o := range options { - err := o(classifier) - if err != nil { - return nil, fmt.Errorf("error setting option %v: %v", o, err) - } - } - - if err := classifier.registerLicenses(); err != nil { - return nil, fmt.Errorf("cannot register licenses from archive: %v", err) - } - return classifier, nil -} - -// NewWithForbiddenLicenses creates a license classifier and pre-loads it with -// known open source licenses which are forbidden. -func NewWithForbiddenLicenses(threshold float64, options ...OptionFunc) (*License, error) { - opts := []OptionFunc{Archive(ForbiddenLicenseArchive)} - opts = append(opts, options...) - return New(threshold, opts...) -} - -// WithinConfidenceThreshold returns true if the confidence value is above or -// equal to the confidence threshold. -func (c *License) WithinConfidenceThreshold(conf float64) bool { - return conf > c.Threshold || math.Abs(conf-c.Threshold) < math.SmallestNonzeroFloat64 -} - -// NearestMatch returns the "nearest" match to the given set of known licenses. -// Returned are the name of the license, and a confidence percentage indicating -// how confident the classifier is in the result. -func (c *License) NearestMatch(contents string) *stringclassifier.Match { - if !c.hasCommonLicenseWords(contents) { - return nil - } - m := c.c.NearestMatch(contents) - m.Name = strings.TrimSuffix(m.Name, ".header") - return m -} - -// MultipleMatch matches all licenses within an unknown text. -func (c *License) MultipleMatch(contents string, includeHeaders bool) stringclassifier.Matches { - norm := normalizeText(contents) - if !c.hasCommonLicenseWords(norm) { - return nil - } - - m := make(map[stringclassifier.Match]bool) - var matches stringclassifier.Matches - for _, v := range c.c.MultipleMatch(norm) { - if !c.WithinConfidenceThreshold(v.Confidence) { - continue - } - - if !includeHeaders && strings.HasSuffix(v.Name, ".header") { - continue - } - - v.Name = strings.TrimSuffix(v.Name, ".header") - if re, ok := forbiddenRegexps[v.Name]; ok && !re.MatchString(norm) { - continue - } - if _, ok := m[*v]; !ok { - m[*v] = true - matches = append(matches, v) - } - } - sort.Sort(matches) - return matches -} - -func normalizeText(s string) string { - for _, n := range Normalizers { - s = n(s) - } - return s -} - -// hasCommonLicenseWords returns true if the unknown text has at least one word -// that's common to all licenses. -func (c *License) hasCommonLicenseWords(s string) bool { - for _, re := range commonLicenseWords { - if re.MatchString(s) { - return true - } - } - return false -} - -type archivedValue struct { - name string - normalized string - set *searchset.SearchSet -} - -// registerLicenses loads all known licenses and adds them to c as known values -// for comparison. The allocated space after ingesting the 'licenses.db' -// archive is ~167M. -func (c *License) registerLicenses() error { - var contents []byte - var err error - if c.archive == nil { - contents, err = ReadLicenseFile(LicenseArchive) - } else { - contents, err = c.archive() - } - if err != nil { - return err - } - - reader := bytes.NewReader(contents) - gr, err := gzip.NewReader(reader) - if err != nil { - return err - } - defer gr.Close() - - tr := tar.NewReader(gr) - - var muVals sync.Mutex - var vals []archivedValue - for i := 0; ; i++ { - hdr, err := tr.Next() - if err == io.EOF { - break - } - if err != nil { - return err - } - - name := strings.TrimSuffix(hdr.Name, ".txt") - - // Read normalized value. - var b bytes.Buffer - if _, err := io.Copy(&b, tr); err != nil { - return err - } - normalized := b.String() - b.Reset() - - // Read precomputed hashes. - hdr, err = tr.Next() - if err != nil { - return err - } - - if _, err := io.Copy(&b, tr); err != nil { - return err - } - - var set searchset.SearchSet - searchset.Deserialize(&b, &set) - - muVals.Lock() - vals = append(vals, archivedValue{name, normalized, &set}) - muVals.Unlock() - } - - for _, v := range vals { - if err = c.c.AddPrecomputedValue(v.name, v.normalized, v.set); err != nil { - return err - } - } - return nil -} - -// endOfLicenseText is text commonly associated with the end of a license. We -// can remove text that occurs after it. -var endOfLicenseText = []string{ - "END OF TERMS AND CONDITIONS", -} - -// TrimExtraneousTrailingText removes text after an obvious end of the license -// and does not include substantive text of the license. -func TrimExtraneousTrailingText(s string) string { - for _, e := range endOfLicenseText { - if i := strings.LastIndex(s, e); i != -1 { - return s[:i+len(e)] - } - } - return s -} - -var copyrightRE = regexp.MustCompile(`(?m)(?i:Copyright)\s+(?i:©\s+|\(c\)\s+)?(?:\d{2,4})(?:[-,]\s*\d{2,4})*,?\s*(?i:by)?\s*(.*?(?i:\s+Inc\.)?)[.,]?\s*(?i:All rights reserved\.?)?\s*$`) - -// CopyrightHolder finds a copyright notification, if it exists, and returns -// the copyright holder. -func CopyrightHolder(contents string) string { - matches := copyrightRE.FindStringSubmatch(contents) - if len(matches) == 2 { - return matches[1] - } - return "" -} - -var publicDomainRE = regexp.MustCompile("(?i)(this file )?is( in the)? public domain") - -// HasPublicDomainNotice performs a simple regex over the contents to see if a -// public domain notice is in there. As you can imagine, this isn't 100% -// definitive, but can be useful if a license match isn't found. -func (c *License) HasPublicDomainNotice(contents string) bool { - return publicDomainRE.FindString(contents) != "" -} - -// ignorableTexts is a list of lines at the start of the string we can remove -// to get a cleaner match. -var ignorableTexts = []*regexp.Regexp{ - regexp.MustCompile(`(?i)^(?:the )?mit license(?: \(mit\))?$`), - regexp.MustCompile(`(?i)^(?:new )?bsd license$`), - regexp.MustCompile(`(?i)^copyright and permission notice$`), - regexp.MustCompile(`(?i)^copyright (\(c\) )?(\[yyyy\]|\d{4})[,.]? .*$`), - regexp.MustCompile(`(?i)^(all|some) rights reserved\.?$`), - regexp.MustCompile(`(?i)^@license$`), - regexp.MustCompile(`^\s*$`), -} - -// removeIgnorableTexts removes common text, which is not important for -// classification, that shows up before the body of the license. -func removeIgnorableTexts(s string) string { - lines := strings.Split(strings.TrimRight(s, "\n"), "\n") - var start int - for ; start < len(lines); start++ { - line := strings.TrimSpace(lines[start]) - var matches bool - for _, re := range ignorableTexts { - if re.MatchString(line) { - matches = true - break - } - } - if !matches { - break - } - } - end := len(lines) - if start > end { - return "\n" - } - return strings.Join(lines[start:end], "\n") + "\n" -} - -// removeShebangLine removes the '#!...' line if it's the first line in the -// file. Note that if it's the only line in a comment, it won't be removed. -func removeShebangLine(s string) string { - lines := strings.Split(s, "\n") - if len(lines) <= 1 || !strings.HasPrefix(lines[0], "#!") { - return s - } - - return strings.Join(lines[1:], "\n") -} - -// isDecorative returns true if the line is made up purely of non-letter and -// non-digit characters. -func isDecorative(s string) bool { - for _, c := range s { - if unicode.IsLetter(c) || unicode.IsDigit(c) { - return false - } - } - return true -} - -var nonWords = regexp.MustCompile("[[:punct:]]+") - -// RemoveNonWords removes non-words from the string. -func RemoveNonWords(s string) string { - return nonWords.ReplaceAllString(s, " ") -} - -// interchangeablePunctutation is punctuation that can be normalized. -var interchangeablePunctuation = []struct { - interchangeable *regexp.Regexp - substitute string -}{ - // Hyphen, Dash, En Dash, and Em Dash. - {regexp.MustCompile(`[-‒–—]`), "-"}, - // Single, Double, Curly Single, and Curly Double. - {regexp.MustCompile("['\"`‘’“”]"), "'"}, - // Copyright. - {regexp.MustCompile("©"), "(c)"}, - // Hyphen-separated words. - {regexp.MustCompile(`(\S)-\s+(\S)`), "${1}-${2}"}, - // Currency and Section. (Different copies of the CDDL use each marker.) - {regexp.MustCompile("[§¤]"), "(s)"}, - // Middle Dot - {regexp.MustCompile("·"), "*"}, -} - -// NormalizePunctuation takes all hyphens and quotes and normalizes them. -func NormalizePunctuation(s string) string { - for _, iw := range interchangeablePunctuation { - s = iw.interchangeable.ReplaceAllString(s, iw.substitute) - } - return s -} - -// interchangeableWords are words we can substitute for a normalized form -// without changing the meaning of the license. See -// https://spdx.org/spdx-license-list/matching-guidelines for the list. -var interchangeableWords = []struct { - interchangeable *regexp.Regexp - substitute string -}{ - {regexp.MustCompile("(?i)Acknowledgment"), "Acknowledgement"}, - {regexp.MustCompile("(?i)Analogue"), "Analog"}, - {regexp.MustCompile("(?i)Analyse"), "Analyze"}, - {regexp.MustCompile("(?i)Artefact"), "Artifact"}, - {regexp.MustCompile("(?i)Authorisation"), "Authorization"}, - {regexp.MustCompile("(?i)Authorised"), "Authorized"}, - {regexp.MustCompile("(?i)Calibre"), "Caliber"}, - {regexp.MustCompile("(?i)Cancelled"), "Canceled"}, - {regexp.MustCompile("(?i)Capitalisations"), "Capitalizations"}, - {regexp.MustCompile("(?i)Catalogue"), "Catalog"}, - {regexp.MustCompile("(?i)Categorise"), "Categorize"}, - {regexp.MustCompile("(?i)Centre"), "Center"}, - {regexp.MustCompile("(?i)Emphasised"), "Emphasized"}, - {regexp.MustCompile("(?i)Favour"), "Favor"}, - {regexp.MustCompile("(?i)Favourite"), "Favorite"}, - {regexp.MustCompile("(?i)Fulfil"), "Fulfill"}, - {regexp.MustCompile("(?i)Fulfilment"), "Fulfillment"}, - {regexp.MustCompile("(?i)Initialise"), "Initialize"}, - {regexp.MustCompile("(?i)Judgment"), "Judgement"}, - {regexp.MustCompile("(?i)Labelling"), "Labeling"}, - {regexp.MustCompile("(?i)Labour"), "Labor"}, - {regexp.MustCompile("(?i)Licence"), "License"}, - {regexp.MustCompile("(?i)Maximise"), "Maximize"}, - {regexp.MustCompile("(?i)Modelled"), "Modeled"}, - {regexp.MustCompile("(?i)Modelling"), "Modeling"}, - {regexp.MustCompile("(?i)Offence"), "Offense"}, - {regexp.MustCompile("(?i)Optimise"), "Optimize"}, - {regexp.MustCompile("(?i)Organisation"), "Organization"}, - {regexp.MustCompile("(?i)Organise"), "Organize"}, - {regexp.MustCompile("(?i)Practise"), "Practice"}, - {regexp.MustCompile("(?i)Programme"), "Program"}, - {regexp.MustCompile("(?i)Realise"), "Realize"}, - {regexp.MustCompile("(?i)Recognise"), "Recognize"}, - {regexp.MustCompile("(?i)Signalling"), "Signaling"}, - {regexp.MustCompile("(?i)Sub[- ]license"), "Sublicense"}, - {regexp.MustCompile("(?i)Utilisation"), "Utilization"}, - {regexp.MustCompile("(?i)Whilst"), "While"}, - {regexp.MustCompile("(?i)Wilful"), "Wilfull"}, - {regexp.MustCompile("(?i)Non-commercial"), "Noncommercial"}, - {regexp.MustCompile("(?i)Per cent"), "Percent"}, -} - -// NormalizeEquivalentWords normalizes equivalent words that are interchangeable. -func NormalizeEquivalentWords(s string) string { - for _, iw := range interchangeableWords { - s = iw.interchangeable.ReplaceAllString(s, iw.substitute) - } - return s -} diff --git a/vendor/github.com/google/licenseclassifier/file_system_resources.go b/vendor/github.com/google/licenseclassifier/file_system_resources.go deleted file mode 100644 index 96b2e6fc..00000000 --- a/vendor/github.com/google/licenseclassifier/file_system_resources.go +++ /dev/null @@ -1,68 +0,0 @@ -// Copyright 2017 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 licenseclassifier - -import ( - "fmt" - "io/ioutil" - "os" - "path/filepath" - "runtime" - "strings" -) - -const ( - // LicenseDirectory is the directory where the prototype licenses are kept. - LicenseDirectory = "src/github.com/google/licenseclassifier/licenses" - // LicenseArchive is the name of the archive containing preprocessed - // license texts. - LicenseArchive = "licenses.db" - // ForbiddenLicenseArchive is the name of the archive containing preprocessed - // forbidden license texts only. - ForbiddenLicenseArchive = "forbidden_licenses.db" -) - -// lcRoot computes the location of the licenses data in the licenseclassifier source tree based on the location of this file. -func lcRoot() (string, error) { - _, filename, _, ok := runtime.Caller(0) - if !ok { - return "", fmt.Errorf("unable to compute path of licenseclassifier source") - } - // this file must be in the root of the package, or the relative paths will be wrong. - return filepath.Join(filepath.Dir(filename), "licenses"), nil -} - -// ReadLicenseFile locates and reads the license archive file. Absolute paths are used unmodified. Relative paths are expected to be in the licenses directory of the licenseclassifier package. -func ReadLicenseFile(filename string) ([]byte, error) { - if strings.HasPrefix(filename, "/") { - return ioutil.ReadFile(filename) - } - - root, err := lcRoot() - if err != nil { - return nil, fmt.Errorf("error locating licenses directory: %v", err) - } - return ioutil.ReadFile(filepath.Join(root, filename)) -} - -// ReadLicenseDir reads directory containing the license files. -func ReadLicenseDir() ([]os.FileInfo, error) { - root, err := lcRoot() - if err != nil { - return nil, fmt.Errorf("error locating licenses directory: %v", err) - } - - return ioutil.ReadDir(root) -} diff --git a/vendor/github.com/google/licenseclassifier/forbidden.go b/vendor/github.com/google/licenseclassifier/forbidden.go deleted file mode 100644 index 6c02ee5d..00000000 --- a/vendor/github.com/google/licenseclassifier/forbidden.go +++ /dev/null @@ -1,48 +0,0 @@ -// Copyright 2017 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 licenseclassifier - -import "regexp" - -var ( - reCCBYNC = regexp.MustCompile(`(?i).*\bAttribution NonCommercial\b.*`) - reCCBYNCND = regexp.MustCompile(`(?i).*\bAttribution NonCommercial NoDerivs\b.*`) - reCCBYNCSA = regexp.MustCompile(`(?i).*\bAttribution NonCommercial ShareAlike\b.*`) - - // forbiddenRegexps are regular expressions we expect to find in - // forbidden licenses. If we think we have a forbidden license but - // don't find the equivalent phrase, then it's probably just a - // misclassification. - forbiddenRegexps = map[string]*regexp.Regexp{ - AGPL10: regexp.MustCompile(`(?i).*\bAFFERO GENERAL PUBLIC LICENSE\b.*`), - AGPL30: regexp.MustCompile(`(?i).*\bGNU AFFERO GENERAL PUBLIC LICENSE\b.*`), - CCBYNC10: reCCBYNC, - CCBYNC20: reCCBYNC, - CCBYNC25: reCCBYNC, - CCBYNC30: reCCBYNC, - CCBYNC40: reCCBYNC, - CCBYNCND10: regexp.MustCompile(`(?i).*\bAttribution NoDerivs NonCommercial\b.*`), - CCBYNCND20: reCCBYNCND, - CCBYNCND25: reCCBYNCND, - CCBYNCND30: reCCBYNCND, - CCBYNCND40: regexp.MustCompile(`(?i).*\bAttribution NonCommercial NoDerivatives\b.*`), - CCBYNCSA10: reCCBYNCSA, - CCBYNCSA20: reCCBYNCSA, - CCBYNCSA25: reCCBYNCSA, - CCBYNCSA30: reCCBYNCSA, - CCBYNCSA40: reCCBYNCSA, - WTFPL: regexp.MustCompile(`(?i).*\bDO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE\b.*`), - } -) diff --git a/vendor/github.com/google/licenseclassifier/go.mod b/vendor/github.com/google/licenseclassifier/go.mod deleted file mode 100644 index 28205e46..00000000 --- a/vendor/github.com/google/licenseclassifier/go.mod +++ /dev/null @@ -1,9 +0,0 @@ -module github.com/google/licenseclassifier - -go 1.11 - -require ( - github.com/google/go-cmp v0.2.0 - github.com/sergi/go-diff v1.0.0 - github.com/stretchr/testify v1.3.0 // indirect -) diff --git a/vendor/github.com/google/licenseclassifier/go.sum b/vendor/github.com/google/licenseclassifier/go.sum deleted file mode 100644 index 99076eeb..00000000 --- a/vendor/github.com/google/licenseclassifier/go.sum +++ /dev/null @@ -1,11 +0,0 @@ -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/google/go-cmp v0.2.0 h1:+dTQ8DZQJz0Mb/HjFlkptS1FeQ4cWSnN941F8aEG4SQ= -github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= -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/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= diff --git a/vendor/github.com/google/licenseclassifier/internal/sets/sets.go b/vendor/github.com/google/licenseclassifier/internal/sets/sets.go deleted file mode 100644 index f34ae5bf..00000000 --- a/vendor/github.com/google/licenseclassifier/internal/sets/sets.go +++ /dev/null @@ -1,20 +0,0 @@ -// Copyright 2017 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 sets provides sets for storing collections of unique elements. -package sets - -// present is an empty struct used as the "value" in the map[int], since -// empty structs consume zero bytes (unlike 1 unnecessary byte per bool). -type present struct{} diff --git a/vendor/github.com/google/licenseclassifier/internal/sets/stringset.go b/vendor/github.com/google/licenseclassifier/internal/sets/stringset.go deleted file mode 100644 index 54edbd4b..00000000 --- a/vendor/github.com/google/licenseclassifier/internal/sets/stringset.go +++ /dev/null @@ -1,228 +0,0 @@ -// Copyright 2017 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 sets - -import ( - "fmt" - "sort" - "strings" -) - -// StringSet stores a set of unique string elements. -type StringSet struct { - set map[string]present -} - -// NewStringSet creates a StringSet containing the supplied initial string elements. -func NewStringSet(elements ...string) *StringSet { - s := &StringSet{} - s.set = make(map[string]present) - s.Insert(elements...) - return s -} - -// Copy returns a newly allocated copy of the supplied StringSet. -func (s *StringSet) Copy() *StringSet { - c := NewStringSet() - if s != nil { - for e := range s.set { - c.set[e] = present{} - } - } - return c -} - -// Insert zero or more string elements into the StringSet. -// As expected for a Set, elements already present in the StringSet are -// simply ignored. -func (s *StringSet) Insert(elements ...string) { - for _, e := range elements { - s.set[e] = present{} - } -} - -// Delete zero or more string elements from the StringSet. -// Any elements not present in the StringSet are simply ignored. -func (s *StringSet) Delete(elements ...string) { - for _, e := range elements { - delete(s.set, e) - } -} - -// Intersect returns a new StringSet containing the intersection of the -// receiver and argument StringSets. Returns an empty set if the argument is nil. -func (s *StringSet) Intersect(other *StringSet) *StringSet { - if other == nil { - return NewStringSet() - } - - // Point a and b to the maps, setting a to the smaller of the two. - a, b := s.set, other.set - if len(b) < len(a) { - a, b = b, a - } - - // Perform the intersection. - intersect := NewStringSet() - for e := range a { - if _, ok := b[e]; ok { - intersect.set[e] = present{} - } - } - return intersect -} - -// Disjoint returns true if the intersection of the receiver and the argument -// StringSets is the empty set. Returns true if the argument is nil or either -// StringSet is the empty set. -func (s *StringSet) Disjoint(other *StringSet) bool { - if other == nil || len(other.set) == 0 || len(s.set) == 0 { - return true - } - - // Point a and b to the maps, setting a to the smaller of the two. - a, b := s.set, other.set - if len(b) < len(a) { - a, b = b, a - } - - // Check for non-empty intersection. - for e := range a { - if _, ok := b[e]; ok { - return false // Early-exit because intersecting. - } - } - return true -} - -// Difference returns a new StringSet containing the elements in the receiver -// that are not present in the argument StringSet. Returns a copy of the -// receiver if the argument is nil. -func (s *StringSet) Difference(other *StringSet) *StringSet { - if other == nil { - return s.Copy() - } - - // Insert only the elements in the receiver that are not present in the - // argument StringSet. - diff := NewStringSet() - for e := range s.set { - if _, ok := other.set[e]; !ok { - diff.set[e] = present{} - } - } - return diff -} - -// Unique returns a new StringSet containing the elements in the receiver -// that are not present in the argument StringSet *and* the elements in the -// argument StringSet that are not in the receiver (which is the union of two -// disjoint sets). Returns a copy of the -// receiver if the argument is nil. -func (s *StringSet) Unique(other *StringSet) *StringSet { - if other == nil { - return s.Copy() - } - - sNotInOther := s.Difference(other) - otherNotInS := other.Difference(s) - - // Duplicate Union implementation here to avoid extra Copy, since both - // sNotInOther and otherNotInS are already copies. - unique := sNotInOther - for e := range otherNotInS.set { - unique.set[e] = present{} - } - return unique -} - -// Equal returns true if the receiver and the argument StringSet contain -// exactly the same elements. -func (s *StringSet) Equal(other *StringSet) bool { - if s == nil || other == nil { - return s == nil && other == nil - } - - // Two sets of different length cannot have the exact same unique elements. - if len(s.set) != len(other.set) { - return false - } - - // Only one loop is needed. If the two sets are known to be of equal - // length, then the two sets are equal only if exactly all of the elements - // in the first set are found in the second. - for e := range s.set { - if _, ok := other.set[e]; !ok { - return false - } - } - - return true -} - -// Union returns a new StringSet containing the union of the receiver and -// argument StringSets. Returns a copy of the receiver if the argument is nil. -func (s *StringSet) Union(other *StringSet) *StringSet { - union := s.Copy() - if other != nil { - for e := range other.set { - union.set[e] = present{} - } - } - return union -} - -// Contains returns true if element is in the StringSet. -func (s *StringSet) Contains(element string) bool { - _, in := s.set[element] - return in -} - -// Len returns the number of unique elements in the StringSet. -func (s *StringSet) Len() int { - return len(s.set) -} - -// Empty returns true if the receiver is the empty set. -func (s *StringSet) Empty() bool { - return len(s.set) == 0 -} - -// Elements returns a []string of the elements in the StringSet, in no -// particular (or consistent) order. -func (s *StringSet) Elements() []string { - elements := []string{} // Return at least an empty slice rather than nil. - for e := range s.set { - elements = append(elements, e) - } - return elements -} - -// Sorted returns a sorted []string of the elements in the StringSet. -func (s *StringSet) Sorted() []string { - elements := s.Elements() - sort.Strings(elements) - return elements -} - -// String formats the StringSet elements as sorted strings, representing them -// in "array initializer" syntax. -func (s *StringSet) String() string { - elements := s.Sorted() - var quoted []string - for _, e := range elements { - quoted = append(quoted, fmt.Sprintf("%q", e)) - } - return fmt.Sprintf("{%s}", strings.Join(quoted, ", ")) -} diff --git a/vendor/github.com/google/licenseclassifier/license_type.go b/vendor/github.com/google/licenseclassifier/license_type.go deleted file mode 100644 index 6cfcbb27..00000000 --- a/vendor/github.com/google/licenseclassifier/license_type.go +++ /dev/null @@ -1,394 +0,0 @@ -// Copyright 2017 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 licenseclassifier - -// *** NOTE: Update this file when adding a new license. You need to: -// -// 1. Add the canonical name to the list, and -// 2. Categorize the license. - -import "github.com/google/licenseclassifier/internal/sets" - -// Canonical names of the licenses. -const ( - // The names come from the https://spdx.org/licenses website, and are - // also the filenames of the licenses in licenseclassifier/licenses. - AFL11 = "AFL-1.1" - AFL12 = "AFL-1.2" - AFL20 = "AFL-2.0" - AFL21 = "AFL-2.1" - AFL30 = "AFL-3.0" - AGPL10 = "AGPL-1.0" - AGPL30 = "AGPL-3.0" - Apache10 = "Apache-1.0" - Apache11 = "Apache-1.1" - Apache20 = "Apache-2.0" - APSL10 = "APSL-1.0" - APSL11 = "APSL-1.1" - APSL12 = "APSL-1.2" - APSL20 = "APSL-2.0" - Artistic10cl8 = "Artistic-1.0-cl8" - Artistic10Perl = "Artistic-1.0-Perl" - Artistic10 = "Artistic-1.0" - Artistic20 = "Artistic-2.0" - BCL = "BCL" - Beerware = "Beerware" - BSD2ClauseFreeBSD = "BSD-2-Clause-FreeBSD" - BSD2ClauseNetBSD = "BSD-2-Clause-NetBSD" - BSD2Clause = "BSD-2-Clause" - BSD3ClauseAttribution = "BSD-3-Clause-Attribution" - BSD3ClauseClear = "BSD-3-Clause-Clear" - BSD3ClauseLBNL = "BSD-3-Clause-LBNL" - BSD3Clause = "BSD-3-Clause" - BSD4Clause = "BSD-4-Clause" - BSD4ClauseUC = "BSD-4-Clause-UC" - BSDProtection = "BSD-Protection" - BSL10 = "BSL-1.0" - CC010 = "CC0-1.0" - CCBY10 = "CC-BY-1.0" - CCBY20 = "CC-BY-2.0" - CCBY25 = "CC-BY-2.5" - CCBY30 = "CC-BY-3.0" - CCBY40 = "CC-BY-4.0" - CCBYNC10 = "CC-BY-NC-1.0" - CCBYNC20 = "CC-BY-NC-2.0" - CCBYNC25 = "CC-BY-NC-2.5" - CCBYNC30 = "CC-BY-NC-3.0" - CCBYNC40 = "CC-BY-NC-4.0" - CCBYNCND10 = "CC-BY-NC-ND-1.0" - CCBYNCND20 = "CC-BY-NC-ND-2.0" - CCBYNCND25 = "CC-BY-NC-ND-2.5" - CCBYNCND30 = "CC-BY-NC-ND-3.0" - CCBYNCND40 = "CC-BY-NC-ND-4.0" - CCBYNCSA10 = "CC-BY-NC-SA-1.0" - CCBYNCSA20 = "CC-BY-NC-SA-2.0" - CCBYNCSA25 = "CC-BY-NC-SA-2.5" - CCBYNCSA30 = "CC-BY-NC-SA-3.0" - CCBYNCSA40 = "CC-BY-NC-SA-4.0" - CCBYND10 = "CC-BY-ND-1.0" - CCBYND20 = "CC-BY-ND-2.0" - CCBYND25 = "CC-BY-ND-2.5" - CCBYND30 = "CC-BY-ND-3.0" - CCBYND40 = "CC-BY-ND-4.0" - CCBYSA10 = "CC-BY-SA-1.0" - CCBYSA20 = "CC-BY-SA-2.0" - CCBYSA25 = "CC-BY-SA-2.5" - CCBYSA30 = "CC-BY-SA-3.0" - CCBYSA40 = "CC-BY-SA-4.0" - CDDL10 = "CDDL-1.0" - CDDL11 = "CDDL-1.1" - CommonsClause = "Commons-Clause" - CPAL10 = "CPAL-1.0" - CPL10 = "CPL-1.0" - eGenix = "eGenix" - EPL10 = "EPL-1.0" - EPL20 = "EPL-2.0" - EUPL10 = "EUPL-1.0" - EUPL11 = "EUPL-1.1" - Facebook2Clause = "Facebook-2-Clause" - Facebook3Clause = "Facebook-3-Clause" - FacebookExamples = "Facebook-Examples" - FreeImage = "FreeImage" - FTL = "FTL" - GPL10 = "GPL-1.0" - GPL20 = "GPL-2.0" - GPL20withautoconfexception = "GPL-2.0-with-autoconf-exception" - GPL20withbisonexception = "GPL-2.0-with-bison-exception" - GPL20withclasspathexception = "GPL-2.0-with-classpath-exception" - GPL20withfontexception = "GPL-2.0-with-font-exception" - GPL20withGCCexception = "GPL-2.0-with-GCC-exception" - GPL30 = "GPL-3.0" - GPL30withautoconfexception = "GPL-3.0-with-autoconf-exception" - GPL30withGCCexception = "GPL-3.0-with-GCC-exception" - GUSTFont = "GUST-Font-License" - ImageMagick = "ImageMagick" - IPL10 = "IPL-1.0" - ISC = "ISC" - LGPL20 = "LGPL-2.0" - LGPL21 = "LGPL-2.1" - LGPL30 = "LGPL-3.0" - LGPLLR = "LGPLLR" - Libpng = "Libpng" - Lil10 = "Lil-1.0" - LinuxOpenIB = "Linux-OpenIB" - LPL102 = "LPL-1.02" - LPL10 = "LPL-1.0" - LPPL13c = "LPPL-1.3c" - MIT = "MIT" - MPL10 = "MPL-1.0" - MPL11 = "MPL-1.1" - MPL20 = "MPL-2.0" - MSPL = "MS-PL" - NCSA = "NCSA" - NPL10 = "NPL-1.0" - NPL11 = "NPL-1.1" - OFL11 = "OFL-1.1" - OpenSSL = "OpenSSL" - OpenVision = "OpenVision" - OSL10 = "OSL-1.0" - OSL11 = "OSL-1.1" - OSL20 = "OSL-2.0" - OSL21 = "OSL-2.1" - OSL30 = "OSL-3.0" - PHP301 = "PHP-3.01" - PHP30 = "PHP-3.0" - PIL = "PIL" - PostgreSQL = "PostgreSQL" - Python20complete = "Python-2.0-complete" - Python20 = "Python-2.0" - QPL10 = "QPL-1.0" - Ruby = "Ruby" - SGIB10 = "SGI-B-1.0" - SGIB11 = "SGI-B-1.1" - SGIB20 = "SGI-B-2.0" - SISSL12 = "SISSL-1.2" - SISSL = "SISSL" - Sleepycat = "Sleepycat" - UnicodeTOU = "Unicode-TOU" - UnicodeDFS2015 = "Unicode-DFS-2015" - UnicodeDFS2016 = "Unicode-DFS-2016" - Unlicense = "Unlicense" - UPL10 = "UPL-1.0" - W3C19980720 = "W3C-19980720" - W3C20150513 = "W3C-20150513" - W3C = "W3C" - WTFPL = "WTFPL" - X11 = "X11" - Xnet = "Xnet" - Zend20 = "Zend-2.0" - ZeroBSD = "0BSD" - ZlibAcknowledgement = "zlib-acknowledgement" - Zlib = "Zlib" - ZPL11 = "ZPL-1.1" - ZPL20 = "ZPL-2.0" - ZPL21 = "ZPL-2.1" -) - -var ( - // Licenses Categorized by Type - - // restricted - Licenses in this category require mandatory source - // distribution if we ships a product that includes third-party code - // protected by such a license. - restrictedType = sets.NewStringSet( - BCL, - CCBYND10, - CCBYND20, - CCBYND25, - CCBYND30, - CCBYND40, - CCBYSA10, - CCBYSA20, - CCBYSA25, - CCBYSA30, - CCBYSA40, - GPL10, - GPL20, - GPL20withautoconfexception, - GPL20withbisonexception, - GPL20withclasspathexception, - GPL20withfontexception, - GPL20withGCCexception, - GPL30, - GPL30withautoconfexception, - GPL30withGCCexception, - LGPL20, - LGPL21, - LGPL30, - NPL10, - NPL11, - OSL10, - OSL11, - OSL20, - OSL21, - OSL30, - QPL10, - Sleepycat, - ) - - // reciprocal - These licenses allow usage of software made available - // under such licenses freely in *unmodified* form. If the third-party - // source code is modified in any way these modifications to the - // original third-party source code must be made available. - reciprocalType = sets.NewStringSet( - APSL10, - APSL11, - APSL12, - APSL20, - CDDL10, - CDDL11, - CPL10, - EPL10, - EPL20, - FreeImage, - IPL10, - MPL10, - MPL11, - MPL20, - Ruby, - ) - - // notice - These licenses contain few restrictions, allowing original - // or modified third-party software to be shipped in any product - // without endangering or encumbering our source code. All of the - // licenses in this category do, however, have an "original Copyright - // notice" or "advertising clause", wherein any external distributions - // must include the notice or clause specified in the license. - noticeType = sets.NewStringSet( - AFL11, - AFL12, - AFL20, - AFL21, - AFL30, - Apache10, - Apache11, - Apache20, - Artistic10cl8, - Artistic10Perl, - Artistic10, - Artistic20, - BSL10, - BSD2ClauseFreeBSD, - BSD2ClauseNetBSD, - BSD2Clause, - BSD3ClauseAttribution, - BSD3ClauseClear, - BSD3ClauseLBNL, - BSD3Clause, - BSD4Clause, - BSD4ClauseUC, - BSDProtection, - CCBY10, - CCBY20, - CCBY25, - CCBY30, - CCBY40, - FTL, - ISC, - ImageMagick, - Libpng, - Lil10, - LinuxOpenIB, - LPL102, - LPL10, - MSPL, - MIT, - NCSA, - OpenSSL, - PHP301, - PHP30, - PIL, - Python20, - Python20complete, - PostgreSQL, - SGIB10, - SGIB11, - SGIB20, - UnicodeDFS2015, - UnicodeDFS2016, - UnicodeTOU, - UPL10, - W3C19980720, - W3C20150513, - W3C, - X11, - Xnet, - Zend20, - ZlibAcknowledgement, - Zlib, - ZPL11, - ZPL20, - ZPL21, - ) - - // permissive - These licenses can be used in (relatively rare) cases - // where third-party software is under a license (not "Public Domain" - // or "free for any use" like 'unencumbered') that is even more lenient - // than a 'notice' license. Use the 'permissive' license type when even - // a copyright notice is not required for license compliance. - permissiveType = sets.NewStringSet() - - // unencumbered - Licenses that basically declare that the code is "free for any use". - unencumberedType = sets.NewStringSet( - CC010, - Unlicense, - ZeroBSD, - ) - - // byexceptiononly - Licenses that are incompatible with all (or most) - // uses in combination with our source code. Commercial third-party - // packages that are purchased and licensed only for a specific use - // fall into this category. - byExceptionOnlyType = sets.NewStringSet( - Beerware, - OFL11, - OpenVision, - ) - - // forbidden - Licenses that are forbidden to be used. - forbiddenType = sets.NewStringSet( - AGPL10, - AGPL30, - CCBYNC10, - CCBYNC20, - CCBYNC25, - CCBYNC30, - CCBYNC40, - CCBYNCND10, - CCBYNCND20, - CCBYNCND25, - CCBYNCND30, - CCBYNCND40, - CCBYNCSA10, - CCBYNCSA20, - CCBYNCSA25, - CCBYNCSA30, - CCBYNCSA40, - CommonsClause, - Facebook2Clause, - Facebook3Clause, - FacebookExamples, - WTFPL, - ) - - // LicenseTypes is a set of the types of licenses Google recognizes. - LicenseTypes = sets.NewStringSet( - "restricted", - "reciprocal", - "notice", - "permissive", - "unencumbered", - "by_exception_only", - ) -) - -// LicenseType returns the type the license has. -func LicenseType(name string) string { - switch { - case restrictedType.Contains(name): - return "restricted" - case reciprocalType.Contains(name): - return "reciprocal" - case noticeType.Contains(name): - return "notice" - case permissiveType.Contains(name): - return "permissive" - case unencumberedType.Contains(name): - return "unencumbered" - case forbiddenType.Contains(name): - return "FORBIDDEN" - } - return "" -} diff --git a/vendor/github.com/google/licenseclassifier/stringclassifier/CONTRIBUTING.md b/vendor/github.com/google/licenseclassifier/stringclassifier/CONTRIBUTING.md deleted file mode 100644 index 143bfd2d..00000000 --- a/vendor/github.com/google/licenseclassifier/stringclassifier/CONTRIBUTING.md +++ /dev/null @@ -1,24 +0,0 @@ -# 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/ diff --git a/vendor/github.com/google/licenseclassifier/stringclassifier/LICENSE b/vendor/github.com/google/licenseclassifier/stringclassifier/LICENSE deleted file mode 100644 index d6456956..00000000 --- a/vendor/github.com/google/licenseclassifier/stringclassifier/LICENSE +++ /dev/null @@ -1,202 +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/google/licenseclassifier/stringclassifier/README.md b/vendor/github.com/google/licenseclassifier/stringclassifier/README.md deleted file mode 100644 index cc8a9eb0..00000000 --- a/vendor/github.com/google/licenseclassifier/stringclassifier/README.md +++ /dev/null @@ -1,65 +0,0 @@ -# StringClassifier - -StringClassifier is a library to classify an unknown text against a set of known -texts. The classifier uses the [Levenshtein Distance] algorithm to determine -which of the known texts most closely matches the unknown text. The Levenshtein -Distance is normalized into a "confidence percentage" between 1 and 0, where 1.0 -indicates an exact match and 0.0 indicates a complete mismatch. - -[Levenshtein Distance]: https://en.wikipedia.org/wiki/Levenshtein_distance - -## Types of matching - -There are two kinds of matching algorithms the string classifier can perform: - -1. [Nearest matching](#nearest), and -2. [Multiple matching](#multiple). - -### Normalization - -To get the best match, normalizing functions can be applied to the texts. For -example, flattening whitespaces removes a lot of inconsequential formatting -differences that would otherwise lower the matching confidence percentage. - -```go -sc := stringclassifier.New(stringclassifier.FlattenWhitespace, strings.ToLower) -``` - -The normalizating functions are run on all the known texts that are added to the -classifier. They're also run on the unknown text before classification. - -### Nearest matching {#nearest} - -A nearest match returns the name of the known text that most closely matches the -full unknown text. This is most useful when the unknown text doesn't have -extraneous text around it. - -Example: - -```go -func IdentifyText(sc *stringclassifier.Classifier, name, unknown string) { - m := sc.NearestMatch(unknown) - log.Printf("The nearest match to %q is %q (confidence: %v)", name, m.Name, m.Confidence) -} -``` - -## Multiple matching {#multiple} - -Multiple matching identifies all of the known texts which may exist in the -unknown text. It can also detect a known text in an unknown text even if there's -extraneous text around the unknown text. As with nearest matching, a confidence -percentage for each match is given. - -Example: - -```go -log.Printf("The text %q contains:", name) -for _, m := range sc.MultipleMatch(unknown, false) { - log.Printf(" %q (conf: %v, offset: %v)", m.Name, m.Confidence, m.Offset) -} -``` - -## Disclaimer - -This is not an official Google product (experimental or otherwise), it is just -code that happens to be owned by Google. diff --git a/vendor/github.com/google/licenseclassifier/stringclassifier/classifier.go b/vendor/github.com/google/licenseclassifier/stringclassifier/classifier.go deleted file mode 100644 index 1bf01e26..00000000 --- a/vendor/github.com/google/licenseclassifier/stringclassifier/classifier.go +++ /dev/null @@ -1,560 +0,0 @@ -// Copyright 2017 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 stringclassifier finds the nearest match between a string and a set of known values. It -// uses the Levenshtein Distance (LD) algorithm to determine this. A match with a large LD is less -// likely to be correct than one with a small LD. A confidence percentage is returned, which -// indicates how confident the algorithm is that the match is correct. The higher the percentage, -// the greater the confidence that the match is correct. -// -// Example Usage: -// -// type Text struct { -// Name string -// Text string -// } -// -// func NewClassifier(knownTexts []Text) (*stringclassifier.Classifier, error) { -// sc := stringclassifier.New(stringclassifier.FlattenWhitespace) -// for _, known := range knownTexts { -// if err := sc.AddValue(known.Name, known.Text); err != nil { -// return nil, err -// } -// } -// return sc, nil -// } -// -// func IdentifyTexts(sc *stringclassifier.Classifier, unknownTexts []*Text) { -// for _, unknown := range unknownTexts { -// m := sc.NearestMatch(unknown.Text) -// log.Printf("The nearest match to %q is %q (confidence: %v)", -// unknown.Name, m.Name, m.Confidence) -// } -// } -package stringclassifier - -import ( - "fmt" - "log" - "math" - "regexp" - "sort" - "sync" - - "github.com/google/licenseclassifier/stringclassifier/internal/pq" - "github.com/google/licenseclassifier/stringclassifier/searchset" - "github.com/sergi/go-diff/diffmatchpatch" -) - -// The diff/match/patch algorithm. -var dmp = diffmatchpatch.New() - -const ( - // DefaultConfidenceThreshold is the minimum ratio threshold between - // the matching range and the full source range that we're willing to - // accept in order to say that the matching range will produce a - // sufficiently good edit distance. I.e., if the matching range is - // below this threshold we won't run the Levenshtein Distance algorithm - // on it. - DefaultConfidenceThreshold float64 = 0.80 - - defaultMinDiffRatio float64 = 0.75 -) - -// A Classifier matches a string to a set of known values. -type Classifier struct { - muValues sync.RWMutex - values map[string]*knownValue - normalizers []NormalizeFunc - threshold float64 - - // MinDiffRatio defines the minimum ratio of the length difference - // allowed to consider a known value a possible match. This is used as - // a performance optimization to eliminate values that are unlikely to - // be a match. - // - // For example, a value of 0.75 means that the shorter string must be - // at least 75% the length of the longer string to consider it a - // possible match. - // - // Setting this to 1.0 will require that strings are identical length. - // Setting this to 0 will consider all known values as possible - // matches. - MinDiffRatio float64 -} - -// NormalizeFunc is a function that is used to normalize a string prior to comparison. -type NormalizeFunc func(string) string - -// New creates a new Classifier with the provided NormalizeFuncs. Each -// NormalizeFunc is applied in order to a string before comparison. -func New(threshold float64, funcs ...NormalizeFunc) *Classifier { - return &Classifier{ - values: make(map[string]*knownValue), - normalizers: append([]NormalizeFunc(nil), funcs...), - threshold: threshold, - MinDiffRatio: defaultMinDiffRatio, - } -} - -// knownValue identifies a value in the corpus to match against. -type knownValue struct { - key string - normalizedValue string - reValue *regexp.Regexp - set *searchset.SearchSet -} - -// AddValue adds a known value to be matched against. If a value already exists -// for key, an error is returned. -func (c *Classifier) AddValue(key, value string) error { - c.muValues.Lock() - defer c.muValues.Unlock() - if _, ok := c.values[key]; ok { - return fmt.Errorf("value already registered with key %q", key) - } - norm := c.normalize(value) - c.values[key] = &knownValue{ - key: key, - normalizedValue: norm, - reValue: regexp.MustCompile(norm), - } - return nil -} - -// AddPrecomputedValue adds a known value to be matched against. The value has -// already been normalized and the SearchSet object deserialized, so no -// processing is necessary. -func (c *Classifier) AddPrecomputedValue(key, value string, set *searchset.SearchSet) error { - c.muValues.Lock() - defer c.muValues.Unlock() - if _, ok := c.values[key]; ok { - return fmt.Errorf("value already registered with key %q", key) - } - set.GenerateNodeList() - c.values[key] = &knownValue{ - key: key, - normalizedValue: value, - reValue: regexp.MustCompile(value), - set: set, - } - return nil -} - -// normalize a string by applying each of the registered NormalizeFuncs. -func (c *Classifier) normalize(s string) string { - for _, fn := range c.normalizers { - s = fn(s) - } - return s -} - -// Match identifies the result of matching a string against a knownValue. -type Match struct { - Name string // Name of knownValue that was matched - Confidence float64 // Confidence percentage - Offset int // The offset into the unknown string the match was made - Extent int // The length from the offset into the unknown string -} - -// Matches is a list of Match-es. This is here mainly so that the list can be -// sorted. -type Matches []*Match - -func (m Matches) Len() int { return len(m) } -func (m Matches) Swap(i, j int) { m[i], m[j] = m[j], m[i] } -func (m Matches) Less(i, j int) bool { - if math.Abs(m[j].Confidence-m[i].Confidence) < math.SmallestNonzeroFloat64 { - if m[i].Name == m[j].Name { - if m[i].Offset > m[j].Offset { - return false - } - if m[i].Offset == m[j].Offset { - return m[i].Extent > m[j].Extent - } - return true - } - return m[i].Name < m[j].Name - } - return m[i].Confidence > m[j].Confidence -} - -// Names returns an unsorted slice of the names of the matched licenses. -func (m Matches) Names() []string { - var names []string - for _, n := range m { - names = append(names, n.Name) - } - return names -} - -// uniquify goes through the matches and removes any that are contained within -// one with a higher confidence. This assumes that Matches is sorted. -func (m Matches) uniquify() Matches { - type matchedRange struct { - offset, extent int - } - - var matched []matchedRange - var matches Matches -OUTER: - for _, match := range m { - for _, mr := range matched { - if match.Offset >= mr.offset && match.Offset <= mr.offset+mr.extent { - continue OUTER - } - } - matched = append(matched, matchedRange{match.Offset, match.Extent}) - matches = append(matches, match) - } - - return matches -} - -// NearestMatch returns the name of the known value that most closely matches -// the unknown string and a confidence percentage is returned indicating how -// confident the classifier is in the result. A percentage of "1.0" indicates -// an exact match, while a percentage of "0.0" indicates a complete mismatch. -// -// If the string is equidistant from multiple known values, it is undefined -// which will be returned. -func (c *Classifier) NearestMatch(s string) *Match { - pq := c.nearestMatch(s) - if pq.Len() == 0 { - return &Match{} - } - return pq.Pop().(*Match) -} - -// MultipleMatch tries to determine which known strings are found within an -// unknown string. This differs from "NearestMatch" in that it looks only at -// those areas within the unknown string that are likely to match. A list of -// potential matches are returned. It's up to the caller to determine which -// ones are acceptable. -func (c *Classifier) MultipleMatch(s string) (matches Matches) { - pq := c.multipleMatch(s) - if pq == nil { - return matches - } - - // A map to remove duplicate entries. - m := make(map[Match]bool) - - for pq.Len() != 0 { - v := pq.Pop().(*Match) - if _, ok := m[*v]; !ok { - m[*v] = true - matches = append(matches, v) - } - } - - sort.Sort(matches) - return matches.uniquify() -} - -// possibleMatch identifies a known value and it's diffRatio to a given string. -type possibleMatch struct { - value *knownValue - diffRatio float64 -} - -// likelyMatches is a slice of possibleMatches that can be sorted by their -// diffRatio to a given string, such that the most likely matches (based on -// length) are at the beginning. -type likelyMatches []possibleMatch - -func (m likelyMatches) Len() int { return len(m) } -func (m likelyMatches) Less(i, j int) bool { return m[i].diffRatio > m[j].diffRatio } -func (m likelyMatches) Swap(i, j int) { m[i], m[j] = m[j], m[i] } - -// nearestMatch returns a Queue of values that the unknown string may be. The -// values are compared via their Levenshtein Distance and ranked with the -// nearest match at the beginning. -func (c *Classifier) nearestMatch(unknown string) *pq.Queue { - var mu sync.Mutex // Protect the priority queue. - pq := pq.NewQueue(func(x, y interface{}) bool { - return x.(*Match).Confidence > y.(*Match).Confidence - }, nil) - - unknown = c.normalize(unknown) - if len(unknown) == 0 { - return pq - } - - c.muValues.RLock() - var likely likelyMatches - for _, v := range c.values { - dr := diffRatio(unknown, v.normalizedValue) - if dr < c.MinDiffRatio { - continue - } - if unknown == v.normalizedValue { - // We found an exact match. - pq.Push(&Match{Name: v.key, Confidence: 1.0, Offset: 0, Extent: len(unknown)}) - c.muValues.RUnlock() - return pq - } - likely = append(likely, possibleMatch{value: v, diffRatio: dr}) - } - c.muValues.RUnlock() - sort.Sort(likely) - - var wg sync.WaitGroup - classifyString := func(name, unknown, known string) { - defer wg.Done() - - diffs := dmp.DiffMain(unknown, known, true) - distance := dmp.DiffLevenshtein(diffs) - confidence := confidencePercentage(len(unknown), len(known), distance) - if confidence > 0.0 { - mu.Lock() - pq.Push(&Match{Name: name, Confidence: confidence, Offset: 0, Extent: len(unknown)}) - mu.Unlock() - } - } - - wg.Add(len(likely)) - for _, known := range likely { - go classifyString(known.value.key, unknown, known.value.normalizedValue) - } - wg.Wait() - return pq -} - -// matcher finds all potential matches of "known" in "unknown". The results are -// placed in "queue". -type matcher struct { - unknown *searchset.SearchSet - normUnknown string - threshold float64 - - mu sync.Mutex - queue *pq.Queue -} - -// newMatcher creates a "matcher" object. -func newMatcher(unknown string, threshold float64) *matcher { - return &matcher{ - unknown: searchset.New(unknown, searchset.DefaultGranularity), - normUnknown: unknown, - threshold: threshold, - queue: pq.NewQueue(func(x, y interface{}) bool { - return x.(*Match).Confidence > y.(*Match).Confidence - }, nil), - } -} - -// findMatches takes a known text and finds all potential instances of it in -// the unknown text. The resulting matches can then filtered to determine which -// are the best matches. -func (m *matcher) findMatches(known *knownValue) { - var mrs []searchset.MatchRanges - if all := known.reValue.FindAllStringIndex(m.normUnknown, -1); all != nil { - // We found exact matches. Just use those! - for _, a := range all { - var start, end int - for i, tok := range m.unknown.Tokens { - if tok.Offset == a[0] { - start = i - } else if tok.Offset >= a[len(a)-1]-len(tok.Text) { - end = i - break - } - } - - mrs = append(mrs, searchset.MatchRanges{{ - SrcStart: 0, - SrcEnd: len(known.set.Tokens), - TargetStart: start, - TargetEnd: end + 1, - }}) - } - } else { - // No exact match. Perform a more thorough match. - mrs = searchset.FindPotentialMatches(known.set, m.unknown) - } - - var wg sync.WaitGroup - for _, mr := range mrs { - if !m.withinConfidenceThreshold(known.set, mr) { - continue - } - - wg.Add(1) - go func(mr searchset.MatchRanges) { - start, end := mr.TargetRange(m.unknown) - conf := levDist(m.normUnknown[start:end], known.normalizedValue) - if conf > 0.0 { - m.mu.Lock() - m.queue.Push(&Match{Name: known.key, Confidence: conf, Offset: start, Extent: end - start}) - m.mu.Unlock() - } - wg.Done() - }(mr) - } - wg.Wait() -} - -// withinConfidenceThreshold returns the Confidence we have in the potential -// match. It does this by calculating the ratio of what's matching to the -// original known text. -func (m *matcher) withinConfidenceThreshold(known *searchset.SearchSet, mr searchset.MatchRanges) bool { - return float64(mr.Size())/float64(len(known.Tokens)) >= m.threshold -} - -// multipleMatch returns a Queue of values that might be within the unknown -// string. The values are compared via their Levenshtein Distance and ranked -// with the nearest match at the beginning. -func (c *Classifier) multipleMatch(unknown string) *pq.Queue { - normUnknown := c.normalize(unknown) - if normUnknown == "" { - return nil - } - - m := newMatcher(normUnknown, c.threshold) - - c.muValues.RLock() - var kvals []*knownValue - for _, known := range c.values { - kvals = append(kvals, known) - } - c.muValues.RUnlock() - - var wg sync.WaitGroup - wg.Add(len(kvals)) - for _, known := range kvals { - go func(known *knownValue) { - if known.set == nil { - k := searchset.New(known.normalizedValue, searchset.DefaultGranularity) - c.muValues.Lock() - c.values[known.key].set = k - c.muValues.Unlock() - } - m.findMatches(known) - wg.Done() - }(known) - } - wg.Wait() - return m.queue -} - -// levDist runs the Levenshtein Distance algorithm on the known and unknown -// texts to measure how well they match. -func levDist(unknown, known string) float64 { - if len(known) == 0 || len(unknown) == 0 { - log.Printf("Zero-sized texts in Levenshtein Distance algorithm: known==%d, unknown==%d", len(known), len(unknown)) - return 0.0 - } - - // Calculate the differences between the potentially matching known - // text and the unknown text. - diffs := dmp.DiffMain(unknown, known, false) - end := diffRangeEnd(known, diffs) - - // Now execute the Levenshtein Distance algorithm to see how much it - // does match. - distance := dmp.DiffLevenshtein(diffs[:end]) - return confidencePercentage(unknownTextLength(unknown, diffs), len(known), distance) -} - -// unknownTextLength returns the length of the unknown text based on the diff range. -func unknownTextLength(unknown string, diffs []diffmatchpatch.Diff) int { - last := len(diffs) - 1 - for ; last >= 0; last-- { - if diffs[last].Type == diffmatchpatch.DiffEqual { - break - } - } - ulen := 0 - for i := 0; i < last+1; i++ { - switch diffs[i].Type { - case diffmatchpatch.DiffEqual, diffmatchpatch.DiffDelete: - ulen += len(diffs[i].Text) - } - } - return ulen -} - -// diffRangeEnd returns the end index for the "Diff" objects that constructs -// (or nearly constructs) the "known" value. -func diffRangeEnd(known string, diffs []diffmatchpatch.Diff) (end int) { - var seen string - for end = 0; end < len(diffs); end++ { - if seen == known { - // Once we've constructed the "known" value, then we've - // reached the point in the diff list where more - // "Diff"s would just make the Levenshtein Distance - // less valid. There shouldn't be further "DiffEqual" - // nodes, because there's nothing further to match in - // the "known" text. - break - } - switch diffs[end].Type { - case diffmatchpatch.DiffEqual, diffmatchpatch.DiffInsert: - seen += diffs[end].Text - } - } - return end -} - -// confidencePercentage calculates how confident we are in the result of the -// match. A percentage of "1.0" means an identical match. A confidence of "0.0" -// means a complete mismatch. -func confidencePercentage(ulen, klen, distance int) float64 { - if ulen == 0 && klen == 0 { - return 1.0 - } - if ulen == 0 || klen == 0 || (distance > ulen && distance > klen) { - return 0.0 - } - return 1.0 - float64(distance)/float64(max(ulen, klen)) -} - -// diffRatio calculates the ratio of the length of s1 and s2, returned as a -// percentage of the length of the longer string. E.g., diffLength("abcd", "e") -// would return 0.25 because "e" is 25% of the size of "abcd". Comparing -// strings of equal length will return 1. -func diffRatio(s1, s2 string) float64 { - x, y := len(s1), len(s2) - if x == 0 && y == 0 { - // Both strings are zero length - return 1.0 - } - if x < y { - return float64(x) / float64(y) - } - return float64(y) / float64(x) -} - -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 -} - -// wsRegexp is a regexp used to identify blocks of whitespace. -var wsRegexp = regexp.MustCompile(`\s+`) - -// FlattenWhitespace will flatten contiguous blocks of whitespace down to a single space. -var FlattenWhitespace NormalizeFunc = func(s string) string { - return wsRegexp.ReplaceAllString(s, " ") -} diff --git a/vendor/github.com/google/licenseclassifier/stringclassifier/internal/pq/priority.go b/vendor/github.com/google/licenseclassifier/stringclassifier/internal/pq/priority.go deleted file mode 100644 index d1797c7a..00000000 --- a/vendor/github.com/google/licenseclassifier/stringclassifier/internal/pq/priority.go +++ /dev/null @@ -1,111 +0,0 @@ -// Copyright 2017 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 pq provides a priority queue. -package pq - -import "container/heap" - -// NewQueue returns an unbounded priority queue that compares elements using -// less; the minimal element is at the top of the queue. -// -// If setIndex is not nil, the queue calls setIndex to inform each element of -// its position in the queue. If an element's priority changes, its position in -// the queue may be incorrect. Call Fix on the element's index to update the -// queue. Call Remove on the element's index to remove it from the queue. -func NewQueue(less func(x, y interface{}) bool, setIndex func(x interface{}, idx int)) *Queue { - return &Queue{ - heap: pqHeap{ - less: less, - setIndex: setIndex, - }, - } -} - -// Queue is a priority queue that supports updating the priority of an element. -// A Queue must be created with NewQueue. -type Queue struct { - heap pqHeap -} - -// Len returns the number of elements in the queue. -func (pq *Queue) Len() int { - return pq.heap.Len() -} - -// Push adds x to the queue. -func (pq *Queue) Push(x interface{}) { - heap.Push(&pq.heap, x) -} - -// Min returns the minimal element. -// Min panics if the queue is empty. -func (pq *Queue) Min() interface{} { - return pq.heap.a[0] -} - -// Pop removes and returns the minimal element. -// Pop panics if the queue is empty. -func (pq *Queue) Pop() interface{} { - return heap.Pop(&pq.heap) -} - -// Fix adjusts the heap to reflect that the element at index has changed priority. -func (pq *Queue) Fix(index int) { - heap.Fix(&pq.heap, index) -} - -// Remove removes the element at index i from the heap. -func (pq *Queue) Remove(index int) { - heap.Remove(&pq.heap, index) -} - -// pqHeap implements heap.Interface. -type pqHeap struct { - a []interface{} - less func(x, y interface{}) bool - setIndex func(x interface{}, idx int) -} - -func (h pqHeap) Len() int { - return len(h.a) -} - -func (h pqHeap) Less(i, j int) bool { - return h.less(h.a[i], h.a[j]) -} - -func (h pqHeap) Swap(i, j int) { - h.a[i], h.a[j] = h.a[j], h.a[i] - if h.setIndex != nil { - h.setIndex(h.a[i], i) - h.setIndex(h.a[j], j) - } -} - -func (h *pqHeap) Push(x interface{}) { - n := len(h.a) - if h.setIndex != nil { - h.setIndex(x, n) - } - h.a = append(h.a, x) -} - -func (h *pqHeap) Pop() interface{} { - old := h.a - n := len(old) - x := old[n-1] - h.a = old[:n-1] - return x -} diff --git a/vendor/github.com/google/licenseclassifier/stringclassifier/searchset/searchset.go b/vendor/github.com/google/licenseclassifier/stringclassifier/searchset/searchset.go deleted file mode 100644 index 2f443e5e..00000000 --- a/vendor/github.com/google/licenseclassifier/stringclassifier/searchset/searchset.go +++ /dev/null @@ -1,491 +0,0 @@ -// Copyright 2017 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 searchset generates hashes for all substrings of a text. Potential -// matches between two SearchSet objects can then be determined quickly. -// Generating the hashes can be expensive, so it's best to perform it once. If -// the text is part of a known corpus, then the SearchSet can be serialized and -// kept in an archive. -// -// Matching occurs by "mapping" ranges from the source text into the target -// text but still retaining the source order: -// -// SOURCE: |-----------------------------| -// -// TARGET: |*****************************************| -// -// MAP SOURCE SECTIONS ONTO TARGET IN SOURCE ORDER: -// -// S: |-[--]-----[---]------[----]------| -// / | \ -// |---| |---------| |-------------| -// T: |*****************************************| -// -// Note that a single source range may match many different ranges in the -// target. The matching algorithm untangles these so that all matched ranges -// are in order with respect to the source ranges. This is especially important -// since the source text may occur more than once in the target text. The -// algorithm finds each potential occurrence of S in T and returns all as -// potential matched ranges. -package searchset - -import ( - "encoding/gob" - "fmt" - "io" - "sort" - - "github.com/google/licenseclassifier/stringclassifier/searchset/tokenizer" -) - -// DefaultGranularity is the minimum size (in words) of the hash chunks. -const DefaultGranularity = 3 - -// SearchSet is a set of substrings that have hashes associated with them, -// making it fast to search for potential matches. -type SearchSet struct { - // Tokens is a tokenized list of the original input string. - Tokens tokenizer.Tokens - // Hashes is a map of checksums to a range of tokens. - Hashes tokenizer.Hash - // Checksums is a list of checksums ordered from longest range to - // shortest. - Checksums []uint32 - // ChecksumRanges are the token ranges for the above checksums. - ChecksumRanges tokenizer.TokenRanges - - nodes []*node -} - -// node consists of a range of tokens along with the checksum for those tokens. -type node struct { - checksum uint32 - tokens *tokenizer.TokenRange -} - -func (n *node) String() string { - return fmt.Sprintf("[%d:%d]", n.tokens.Start, n.tokens.End) -} - -// New creates a new SearchSet object. It generates a hash for each substring of "s". -func New(s string, granularity int) *SearchSet { - toks := tokenizer.Tokenize(s) - - // Start generating hash values for all substrings within the text. - h := make(tokenizer.Hash) - checksums, tokenRanges := toks.GenerateHashes(h, func(a, b int) int { - if a < b { - return a - } - return b - }(len(toks), granularity)) - sset := &SearchSet{ - Tokens: toks, - Hashes: h, - Checksums: checksums, - ChecksumRanges: tokenRanges, - } - sset.GenerateNodeList() - return sset -} - -// GenerateNodeList creates a node list out of the search set. -func (s *SearchSet) GenerateNodeList() { - if len(s.Tokens) == 0 { - return - } - - for i := 0; i < len(s.Checksums); i++ { - s.nodes = append(s.nodes, &node{ - checksum: s.Checksums[i], - tokens: s.ChecksumRanges[i], - }) - } -} - -// Serialize emits the SearchSet out so that it can be recreated at a later -// time. -func (s *SearchSet) Serialize(w io.Writer) error { - return gob.NewEncoder(w).Encode(s) -} - -// Deserialize reads a file with a serialized SearchSet in it and reconstructs it. -func Deserialize(r io.Reader, s *SearchSet) error { - if err := gob.NewDecoder(r).Decode(&s); err != nil { - return err - } - s.GenerateNodeList() - return nil -} - -// MatchRange is the range within the source text that is a match to the range -// in the target text. -type MatchRange struct { - // Offsets into the source tokens. - SrcStart, SrcEnd int - // Offsets into the target tokens. - TargetStart, TargetEnd int -} - -// in returns true if the start and end are enclosed in the match range. -func (m *MatchRange) in(start, end int) bool { - return start >= m.TargetStart && end <= m.TargetEnd -} - -func (m *MatchRange) String() string { - return fmt.Sprintf("[%v, %v)->[%v, %v)", m.SrcStart, m.SrcEnd, m.TargetStart, m.TargetEnd) -} - -// MatchRanges is a list of "MatchRange"s. The ranges are monotonically -// increasing in value and indicate a single potential occurrence of the source -// text in the target text. -type MatchRanges []*MatchRange - -func (m MatchRanges) Len() int { return len(m) } -func (m MatchRanges) Swap(i, j int) { m[i], m[j] = m[j], m[i] } -func (m MatchRanges) Less(i, j int) bool { - if m[i].TargetStart < m[j].TargetStart { - return true - } - return m[i].TargetStart == m[j].TargetStart && m[i].SrcStart < m[j].SrcStart -} - -// TargetRange is the start and stop token offsets into the target text. -func (m MatchRanges) TargetRange(target *SearchSet) (start, end int) { - start = target.Tokens[m[0].TargetStart].Offset - end = target.Tokens[m[len(m)-1].TargetEnd-1].Offset + len(target.Tokens[m[len(m)-1].TargetEnd-1].Text) - return start, end -} - -// Size is the number of source tokens that were matched. -func (m MatchRanges) Size() int { - sum := 0 - for _, mr := range m { - sum += mr.SrcEnd - mr.SrcStart - } - return sum -} - -// FindPotentialMatches returns the ranges in the target (unknown) text that -// are best potential matches to the source (known) text. -func FindPotentialMatches(src, target *SearchSet) []MatchRanges { - matchedRanges := getMatchedRanges(src, target) - if len(matchedRanges) == 0 { - return nil - } - - // Cleanup the matching ranges so that we get the longest contiguous ranges. - for i := 0; i < len(matchedRanges); i++ { - matchedRanges[i] = coalesceMatchRanges(matchedRanges[i]) - } - return matchedRanges -} - -// getMatchedRanges finds the ranges in the target text that match the source -// text. There can be multiple occurrences of the source text within the target -// text. Each separate occurrence is an entry in the returned slice. -func getMatchedRanges(src, target *SearchSet) []MatchRanges { - matched := targetMatchedRanges(src, target) - if len(matched) == 0 { - return nil - } - sort.Sort(matched) - matched = untangleSourceRanges(matched) - matchedRanges := splitRanges(matched) - return mergeConsecutiveRanges(matchedRanges) -} - -func extendsAny(tr tokenizer.TokenRanges, mr []MatchRanges) bool { - if len(mr) == 0 { - return false - } - for _, tv := range tr { - for _, mv := range mr { - if tv.Start >= mv[0].TargetStart && tv.Start <= mv[len(mv)-1].TargetEnd { - return true - } - } - } - return false -} - -// targetMatchedRanges finds matching sequences in target and src ordered by target position -func targetMatchedRanges(src, target *SearchSet) MatchRanges { - if src.nodes == nil { - return nil - } - - var matched MatchRanges - var previous *node - var possible []MatchRanges - for _, tgtNode := range target.nodes { - sr, ok := src.Hashes[tgtNode.checksum] - if !ok || (previous != nil && tgtNode.tokens.Start > previous.tokens.End) || !extendsAny(sr, possible) { - for _, r := range possible { - matched = append(matched, r...) - } - possible = possible[:0] - previous = nil - } - if !ok { - // There isn't a match in the source. - continue - } - - // Maps index within `possible` to the slice of ranges extended by a new range - extended := make(map[int]*MatchRanges) - // Go over the set of source ranges growing lists of `possible` match ranges. - tv := tgtNode.tokens - for _, sv := range sr { - r := &MatchRange{ - SrcStart: sv.Start, - SrcEnd: sv.End, - TargetStart: tv.Start, - TargetEnd: tv.End, - } - found := false - // Grow or extend each abutting `possible` match range. - for i, p := range possible { - last := p[len(p)-1] - if sv.Start >= last.SrcStart && sv.Start <= last.SrcEnd && tv.Start >= last.TargetStart && tv.Start <= last.TargetEnd { - found = true - possible[i] = append(possible[i], r) - extended[i] = &possible[i] - } - } - if !found { - // Did not abut any existing ranges, start a new `possible` match range. - mrs := make(MatchRanges, 0, 2) - mrs = append(mrs, r) - possible = append(possible, mrs) - extended[len(possible)-1] = &possible[len(possible)-1] - } - } - if len(extended) < len(possible) { - // Ranges not extended--add to `matched` if not included in other range. - for i := 0; i < len(possible); { - _, updated := extended[i] - if updated { - i++ // Keep in `possible` and advance to next index. - continue - } - p1 := possible[i] - found := false // whether found as subrange of another `possible` match. - for _, p2 := range extended { - if p1[0].SrcStart >= (*p2)[0].SrcStart && p1[0].TargetStart >= (*p2)[0].TargetStart { - found = true - break - } - } - if !found { - matched = append(matched, p1...) - } // else included in other match. - // Finished -- delete from `possible` and continue from same index. - possible = append(possible[:i], possible[i+1:]...) - } - } - previous = tgtNode - } - // At end of file, terminate all `possible` match ranges. - for i := 0; i < len(possible); i++ { - p1 := possible[i] - found := false // whether found as subrange of another `possible` match. - for j := i + 1; j < len(possible); { - p2 := possible[j] - if p1[0].SrcStart <= p2[0].SrcStart && p1[0].TargetStart <= p2[0].TargetStart { - // Delete later sub-ranges included in this range. - possible = append(possible[:j], possible[j+1:]...) - continue - } - // Skip if subrange of a later range - if p1[0].SrcStart >= p2[0].SrcStart && p1[0].TargetStart >= p2[0].TargetStart { - found = true - } - j++ - } - if !found { - matched = append(matched, p1...) - } - } - return matched -} - -// untangleSourceRanges goes through the ranges and removes any whose source -// ranges are "out of order". A source range is "out of order" if the source -// range is out of sequence with the source ranges before and after it. This -// happens when more than one source range maps to the same target range. -// E.g.: -// -// SrcStart: 20, SrcEnd: 30, TargetStart: 127, TargetEnd: 137 -// 1: SrcStart: 12, SrcEnd: 17, TargetStart: 138, TargetEnd: 143 -// 2: SrcStart: 32, SrcEnd: 37, TargetStart: 138, TargetEnd: 143 -// SrcStart: 38, SrcEnd: 40, TargetStart: 144, TargetEnd: 146 -// -// Here (1) is out of order, because the source range [12, 17) is out of -// sequence with the surrounding source sequences, but [32, 37) is. -func untangleSourceRanges(matched MatchRanges) MatchRanges { - mr := MatchRanges{matched[0]} -NEXT: - for i := 1; i < len(matched); i++ { - if mr[len(mr)-1].TargetStart == matched[i].TargetStart && mr[len(mr)-1].TargetEnd == matched[i].TargetEnd { - // The matched range has already been added. - continue - } - - if i+1 < len(matched) && equalTargetRange(matched[i], matched[i+1]) { - // A sequence of ranges match the same target range. - // Find the first one that has a source range greater - // than the currently matched range. Omit all others. - if matched[i].SrcStart > mr[len(mr)-1].SrcStart { - mr = append(mr, matched[i]) - continue - } - - for j := i + 1; j < len(matched) && equalTargetRange(matched[i], matched[j]); j++ { - // Check subsequent ranges to see if we can - // find one that matches in the correct order. - if matched[j].SrcStart > mr[len(mr)-1].SrcStart { - mr = append(mr, matched[j]) - i = j - continue NEXT - } - } - } - - mr = append(mr, matched[i]) - } - return mr -} - -// equalTargetRange returns true if the two MatchRange's cover the same target range. -func equalTargetRange(this, that *MatchRange) bool { - return this.TargetStart == that.TargetStart && this.TargetEnd == that.TargetEnd -} - -// splitRanges splits the matched ranges so that a single match range has a -// monotonically increasing source range (indicating a single, potential -// instance of the source in the target). -func splitRanges(matched MatchRanges) []MatchRanges { - var matchedRanges []MatchRanges - mr := MatchRanges{matched[0]} - for i := 1; i < len(matched); i++ { - if mr[len(mr)-1].SrcStart > matched[i].SrcStart { - matchedRanges = append(matchedRanges, mr) - mr = MatchRanges{matched[i]} - } else { - mr = append(mr, matched[i]) - } - } - matchedRanges = append(matchedRanges, mr) - return matchedRanges -} - -// mergeConsecutiveRanges goes through the matched ranges and merges -// consecutive ranges. Two ranges are consecutive if the end of the previous -// matched range and beginning of the next matched range overlap. "matched" -// should have 1 or more MatchRanges, each with one or more MatchRange objects. -func mergeConsecutiveRanges(matched []MatchRanges) []MatchRanges { - mr := []MatchRanges{matched[0]} - - // Convenience functions. - prevMatchedRange := func() MatchRanges { - return mr[len(mr)-1] - } - prevMatchedRangeLastElem := func() *MatchRange { - return prevMatchedRange()[len(prevMatchedRange())-1] - } - - // This algorithm compares the start of each MatchRanges object to the - // end of the previous MatchRanges object. If they overlap, then it - // tries to combine them. Note that a 0 offset into a MatchRanges - // object (e.g., matched[i][0]) is its first MatchRange, which - // indicates the start of the whole matched range. -NEXT: - for i := 1; i < len(matched); i++ { - if prevMatchedRangeLastElem().TargetEnd > matched[i][0].TargetStart { - // Consecutive matched ranges overlap. Merge them. - if prevMatchedRangeLastElem().TargetStart < matched[i][0].TargetStart { - // The last element of the previous matched - // range overlaps with the first element of the - // current matched range. Concatenate them. - if prevMatchedRangeLastElem().TargetEnd < matched[i][0].TargetEnd { - prevMatchedRangeLastElem().SrcEnd += matched[i][0].TargetEnd - prevMatchedRangeLastElem().TargetEnd - prevMatchedRangeLastElem().TargetEnd = matched[i][0].TargetEnd - } - mr[len(mr)-1] = append(prevMatchedRange(), matched[i][1:]...) - continue - } - - for j := 1; j < len(matched[i]); j++ { - // Find the positions in the ranges where the - // tail end of the previous matched range - // overlaps with the start of the next matched - // range. - for k := len(prevMatchedRange()) - 1; k > 0; k-- { - if prevMatchedRange()[k].SrcStart < matched[i][j].SrcStart && - prevMatchedRange()[k].TargetStart < matched[i][j].TargetStart { - // Append the next range to the previous range. - if prevMatchedRange()[k].TargetEnd < matched[i][j].TargetStart { - // Coalesce the ranges. - prevMatchedRange()[k].SrcEnd += matched[i][j-1].TargetEnd - prevMatchedRange()[k].TargetEnd - prevMatchedRange()[k].TargetEnd = matched[i][j-1].TargetEnd - } - mr[len(mr)-1] = append(prevMatchedRange()[:k+1], matched[i][j:]...) - continue NEXT - } - } - } - } - mr = append(mr, matched[i]) - } - return mr -} - -// coalesceMatchRanges coalesces overlapping match ranges into a single -// contiguous match range. -func coalesceMatchRanges(matchedRanges MatchRanges) MatchRanges { - coalesced := MatchRanges{matchedRanges[0]} - for i := 1; i < len(matchedRanges); i++ { - c := coalesced[len(coalesced)-1] - mr := matchedRanges[i] - - if mr.SrcStart <= c.SrcEnd && mr.SrcStart >= c.SrcStart { - var se, ts, te int - if mr.SrcEnd > c.SrcEnd { - se = mr.SrcEnd - } else { - se = c.SrcEnd - } - if mr.TargetStart < c.TargetStart { - ts = mr.TargetStart - } else { - ts = c.TargetStart - } - if mr.TargetEnd > c.TargetEnd { - te = mr.TargetEnd - } else { - te = c.TargetEnd - } - coalesced[len(coalesced)-1] = &MatchRange{ - SrcStart: c.SrcStart, - SrcEnd: se, - TargetStart: ts, - TargetEnd: te, - } - } else { - coalesced = append(coalesced, mr) - } - } - return coalesced -} diff --git a/vendor/github.com/google/licenseclassifier/stringclassifier/searchset/tokenizer/tokenizer.go b/vendor/github.com/google/licenseclassifier/stringclassifier/searchset/tokenizer/tokenizer.go deleted file mode 100644 index 0f842d86..00000000 --- a/vendor/github.com/google/licenseclassifier/stringclassifier/searchset/tokenizer/tokenizer.go +++ /dev/null @@ -1,175 +0,0 @@ -// Copyright 2017 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 tokenizer converts a text into a stream of tokens. -package tokenizer - -import ( - "bytes" - "fmt" - "hash/crc32" - "sort" - "unicode" - "unicode/utf8" -) - -// Token is a non-whitespace sequence (i.e., word or punctuation) in the -// original string. This is not meant for use outside of this package. -type token struct { - Text string - Offset int -} - -// Tokens is a list of Token objects. -type Tokens []*token - -// newToken creates a new token object with an invalid (negative) offset, which -// will be set before the token's used. -func newToken() *token { - return &token{Offset: -1} -} - -// Tokenize converts a string into a stream of tokens. -func Tokenize(s string) (toks Tokens) { - tok := newToken() - for i := 0; i < len(s); { - r, size := utf8.DecodeRuneInString(s[i:]) - switch { - case unicode.IsSpace(r): - if tok.Offset >= 0 { - toks = append(toks, tok) - tok = newToken() - } - case unicode.IsPunct(r): - if tok.Offset >= 0 { - toks = append(toks, tok) - tok = newToken() - } - toks = append(toks, &token{ - Text: string(r), - Offset: i, - }) - default: - if tok.Offset == -1 { - tok.Offset = i - } - tok.Text += string(r) - } - i += size - } - if tok.Offset != -1 { - // Add any remaining token that wasn't yet included in the list. - toks = append(toks, tok) - } - return toks -} - -// GenerateHashes generates hashes for "size" length substrings. The -// "stringifyTokens" call takes a long time to run, so not all substrings have -// hashes, i.e. we skip some of the smaller substrings. -func (t Tokens) GenerateHashes(h Hash, size int) ([]uint32, TokenRanges) { - if size == 0 { - return nil, nil - } - - var css []uint32 - var tr TokenRanges - for offset := 0; offset+size <= len(t); offset += size / 2 { - var b bytes.Buffer - t.stringifyTokens(&b, offset, size) - cs := crc32.ChecksumIEEE(b.Bytes()) - css = append(css, cs) - tr = append(tr, &TokenRange{offset, offset + size}) - h.add(cs, offset, offset+size) - if size <= 1 { - break - } - } - - return css, tr -} - -// stringifyTokens serializes a sublist of tokens into a bytes buffer. -func (t Tokens) stringifyTokens(b *bytes.Buffer, offset, size int) { - for j := offset; j < offset+size; j++ { - if j != offset { - b.WriteRune(' ') - } - b.WriteString(t[j].Text) - } -} - -// TokenRange indicates the range of tokens that map to a particular checksum. -type TokenRange struct { - Start int - End int -} - -func (t *TokenRange) String() string { - return fmt.Sprintf("[%v, %v)", t.Start, t.End) -} - -// TokenRanges is a list of TokenRange objects. The chance that two different -// strings map to the same checksum is very small, but unfortunately isn't -// zero, so we use this instead of making the assumption that they will all be -// unique. -type TokenRanges []*TokenRange - -func (t TokenRanges) Len() int { return len(t) } -func (t TokenRanges) Swap(i, j int) { t[i], t[j] = t[j], t[i] } -func (t TokenRanges) Less(i, j int) bool { return t[i].Start < t[j].Start } - -// CombineUnique returns the combination of both token ranges with no duplicates. -func (t TokenRanges) CombineUnique(other TokenRanges) TokenRanges { - if len(other) == 0 { - return t - } - if len(t) == 0 { - return other - } - - cu := append(t, other...) - sort.Sort(cu) - - if len(cu) == 0 { - return nil - } - - res := TokenRanges{cu[0]} - for prev, i := cu[0], 1; i < len(cu); i++ { - if prev.Start != cu[i].Start || prev.End != cu[i].End { - res = append(res, cu[i]) - prev = cu[i] - } - } - return res -} - -// Hash is a map of the hashes of a section of text to the token range covering that text. -type Hash map[uint32]TokenRanges - -// add associates a token range, [start, end], to a checksum. -func (h Hash) add(checksum uint32, start, end int) { - ntr := &TokenRange{Start: start, End: end} - if r, ok := h[checksum]; ok { - for _, tr := range r { - if tr.Start == ntr.Start && tr.End == ntr.End { - // The token range already exists at this - // checksum. No need to re-add it. - return - } - } - } - h[checksum] = append(h[checksum], ntr) -} diff --git a/vendor/github.com/imdario/mergo/.deepsource.toml b/vendor/github.com/imdario/mergo/.deepsource.toml deleted file mode 100644 index 8a0681af..00000000 --- a/vendor/github.com/imdario/mergo/.deepsource.toml +++ /dev/null @@ -1,12 +0,0 @@ -version = 1 - -test_patterns = [ - "*_test.go" -] - -[[analyzers]] -name = "go" -enabled = true - - [analyzers.meta] - import_path = "github.com/imdario/mergo" \ No newline at end of file diff --git a/vendor/github.com/imdario/mergo/.travis.yml b/vendor/github.com/imdario/mergo/.travis.yml index dad29725..b13a50ed 100644 --- a/vendor/github.com/imdario/mergo/.travis.yml +++ b/vendor/github.com/imdario/mergo/.travis.yml @@ -4,6 +4,4 @@ install: - go get golang.org/x/tools/cmd/cover - go get github.com/mattn/goveralls script: - - go test -race -v ./... -after_script: - $HOME/gopath/bin/goveralls -service=travis-ci -repotoken $COVERALLS_TOKEN diff --git a/vendor/github.com/imdario/mergo/README.md b/vendor/github.com/imdario/mergo/README.md index 02fc81e0..d1cefa87 100644 --- a/vendor/github.com/imdario/mergo/README.md +++ b/vendor/github.com/imdario/mergo/README.md @@ -13,7 +13,6 @@ It is ready for production use. [It is used in several projects by Docker, Googl [![Build Status][1]][2] [![Coverage Status][7]][8] [![Sourcegraph][9]][10] -[![FOSSA Status](https://app.fossa.io/api/projects/git%2Bgithub.com%2Fimdario%2Fmergo.svg?type=shield)](https://app.fossa.io/projects/git%2Bgithub.com%2Fimdario%2Fmergo?ref=badge_shield) [1]: https://travis-ci.org/imdario/mergo.png [2]: https://travis-ci.org/imdario/mergo @@ -28,7 +27,7 @@ It is ready for production use. [It is used in several projects by Docker, Googl ### Latest release -[Release v0.3.7](https://github.com/imdario/mergo/releases/tag/v0.3.7). +[Release v0.3.4](https://github.com/imdario/mergo/releases/tag/v0.3.4). ### Important note @@ -218,21 +217,6 @@ If I can help you, you have an idea or you are using Mergo in your projects, don Written by [Dario Castañé](http://dario.im). -## Top Contributors - -[![0](https://sourcerer.io/fame/imdario/imdario/mergo/images/0)](https://sourcerer.io/fame/imdario/imdario/mergo/links/0) -[![1](https://sourcerer.io/fame/imdario/imdario/mergo/images/1)](https://sourcerer.io/fame/imdario/imdario/mergo/links/1) -[![2](https://sourcerer.io/fame/imdario/imdario/mergo/images/2)](https://sourcerer.io/fame/imdario/imdario/mergo/links/2) -[![3](https://sourcerer.io/fame/imdario/imdario/mergo/images/3)](https://sourcerer.io/fame/imdario/imdario/mergo/links/3) -[![4](https://sourcerer.io/fame/imdario/imdario/mergo/images/4)](https://sourcerer.io/fame/imdario/imdario/mergo/links/4) -[![5](https://sourcerer.io/fame/imdario/imdario/mergo/images/5)](https://sourcerer.io/fame/imdario/imdario/mergo/links/5) -[![6](https://sourcerer.io/fame/imdario/imdario/mergo/images/6)](https://sourcerer.io/fame/imdario/imdario/mergo/links/6) -[![7](https://sourcerer.io/fame/imdario/imdario/mergo/images/7)](https://sourcerer.io/fame/imdario/imdario/mergo/links/7) - - ## License [BSD 3-Clause](http://opensource.org/licenses/BSD-3-Clause) license, as [Go language](http://golang.org/LICENSE). - - -[![FOSSA Status](https://app.fossa.io/api/projects/git%2Bgithub.com%2Fimdario%2Fmergo.svg?type=large)](https://app.fossa.io/projects/git%2Bgithub.com%2Fimdario%2Fmergo?ref=badge_large) diff --git a/vendor/github.com/imdario/mergo/map.go b/vendor/github.com/imdario/mergo/map.go index d83258b4..6ea38e63 100644 --- a/vendor/github.com/imdario/mergo/map.go +++ b/vendor/github.com/imdario/mergo/map.go @@ -72,7 +72,6 @@ func deepMap(dst, src reflect.Value, visited map[uintptr]*visit, depth int, conf case reflect.Struct: srcMap := src.Interface().(map[string]interface{}) for key := range srcMap { - config.overwriteWithEmptyValue = true srcValue := srcMap[key] fieldName := changeInitialCase(key, unicode.ToUpper) dstElement := dst.FieldByName(fieldName) @@ -99,11 +98,11 @@ func deepMap(dst, src reflect.Value, visited map[uintptr]*visit, depth int, conf continue } if srcKind == dstKind { - if _, err = deepMerge(dstElement, srcElement, visited, depth+1, config); err != nil { + if err = deepMerge(dstElement, srcElement, visited, depth+1, config); err != nil { return } } else if dstKind == reflect.Interface && dstElement.Kind() == reflect.Interface { - if _, err = deepMerge(dstElement, srcElement, visited, depth+1, config); err != nil { + if err = deepMerge(dstElement, srcElement, visited, depth+1, config); err != nil { return } } else if srcKind == reflect.Map { @@ -157,8 +156,7 @@ func _map(dst, src interface{}, opts ...func(*Config)) error { // To be friction-less, we redirect equal-type arguments // to deepMerge. Only because arguments can be anything. if vSrc.Kind() == vDst.Kind() { - _, err := deepMerge(vDst, vSrc, make(map[uintptr]*visit), 0, config) - return err + return deepMerge(vDst, vSrc, make(map[uintptr]*visit), 0, config) } switch vSrc.Kind() { case reflect.Struct: diff --git a/vendor/github.com/imdario/mergo/merge.go b/vendor/github.com/imdario/mergo/merge.go index 3332c9c2..706b2206 100644 --- a/vendor/github.com/imdario/mergo/merge.go +++ b/vendor/github.com/imdario/mergo/merge.go @@ -9,41 +9,25 @@ package mergo import ( - "fmt" "reflect" - "unsafe" ) func hasExportedField(dst reflect.Value) (exported bool) { for i, n := 0, dst.NumField(); i < n; i++ { field := dst.Type().Field(i) - if isExportedComponent(&field) { - return true + if field.Anonymous && dst.Field(i).Kind() == reflect.Struct { + exported = exported || hasExportedField(dst.Field(i)) + } else { + exported = exported || len(field.PkgPath) == 0 } } return } -func isExportedComponent(field *reflect.StructField) bool { - name := field.Name - pkgPath := field.PkgPath - if len(pkgPath) > 0 { - return false - } - c := name[0] - if 'a' <= c && c <= 'z' || c == '_' { - return false - } - return true -} - type Config struct { - Overwrite bool - AppendSlice bool - TypeCheck bool - Transformers Transformers - overwriteWithEmptyValue bool - overwriteSliceWithEmptyValue bool + Overwrite bool + AppendSlice bool + Transformers Transformers } type Transformers interface { @@ -53,17 +37,12 @@ type Transformers interface { // Traverses recursively both values, assigning src's fields values to dst. // The map argument tracks comparisons that have already been seen, which allows // short circuiting on recursive types. -func deepMerge(dstIn, src reflect.Value, visited map[uintptr]*visit, depth int, config *Config) (dst reflect.Value, err error) { - dst = dstIn +func deepMerge(dst, src reflect.Value, visited map[uintptr]*visit, depth int, config *Config) (err error) { overwrite := config.Overwrite - typeCheck := config.TypeCheck - overwriteWithEmptySrc := config.overwriteWithEmptyValue - overwriteSliceWithEmptySrc := config.overwriteSliceWithEmptyValue if !src.IsValid() { return } - if dst.CanAddr() { addr := dst.UnsafeAddr() h := 17 * addr @@ -71,7 +50,7 @@ func deepMerge(dstIn, src reflect.Value, visited map[uintptr]*visit, depth int, typ := dst.Type() for p := seen; p != nil; p = p.next { if p.ptr == addr && p.typ == typ { - return dst, nil + return nil } } // Remember, remember... @@ -85,170 +64,130 @@ func deepMerge(dstIn, src reflect.Value, visited map[uintptr]*visit, depth int, } } - if dst.IsValid() && src.IsValid() && src.Type() != dst.Type() { - err = fmt.Errorf("cannot append two different types (%s, %s)", src.Kind(), dst.Kind()) - return - } - switch dst.Kind() { case reflect.Struct: if hasExportedField(dst) { - dstCp := reflect.New(dst.Type()).Elem() for i, n := 0, dst.NumField(); i < n; i++ { - dstField := dst.Field(i) - structField := dst.Type().Field(i) - // copy un-exported struct fields - if !isExportedComponent(&structField) { - rf := dstCp.Field(i) - rf = reflect.NewAt(rf.Type(), unsafe.Pointer(rf.UnsafeAddr())).Elem() //nolint:gosec - dstRF := dst.Field(i) - if !dst.Field(i).CanAddr() { - continue - } - - dstRF = reflect.NewAt(dstRF.Type(), unsafe.Pointer(dstRF.UnsafeAddr())).Elem() //nolint:gosec - rf.Set(dstRF) - continue - } - dstField, err = deepMerge(dstField, src.Field(i), visited, depth+1, config) - if err != nil { + if err = deepMerge(dst.Field(i), src.Field(i), visited, depth+1, config); err != nil { return } - dstCp.Field(i).Set(dstField) } - - if dst.CanSet() { - dst.Set(dstCp) - } else { - dst = dstCp - } - return } else { - if (isReflectNil(dst) || overwrite) && (!isEmptyValue(src) || overwriteWithEmptySrc) { - dst = src + if dst.CanSet() && !isEmptyValue(src) && (overwrite || isEmptyValue(dst)) { + dst.Set(src) } } - case reflect.Map: if dst.IsNil() && !src.IsNil() { - if dst.CanSet() { - dst.Set(reflect.MakeMap(dst.Type())) - } else { - dst = src - return - } + dst.Set(reflect.MakeMap(dst.Type())) } for _, key := range src.MapKeys() { srcElement := src.MapIndex(key) - dstElement := dst.MapIndex(key) if !srcElement.IsValid() { continue } - if dst.MapIndex(key).IsValid() { - k := dstElement.Interface() - dstElement = reflect.ValueOf(k) - } - if isReflectNil(srcElement) { - if overwrite || isReflectNil(dstElement) { - dst.SetMapIndex(key, srcElement) + dstElement := dst.MapIndex(key) + switch srcElement.Kind() { + case reflect.Chan, reflect.Func, reflect.Map, reflect.Interface, reflect.Slice: + if srcElement.IsNil() { + continue + } + fallthrough + default: + if !srcElement.CanInterface() { + continue + } + switch reflect.TypeOf(srcElement.Interface()).Kind() { + case reflect.Struct: + fallthrough + case reflect.Ptr: + fallthrough + case reflect.Map: + srcMapElm := srcElement + dstMapElm := dstElement + if srcMapElm.CanInterface() { + srcMapElm = reflect.ValueOf(srcMapElm.Interface()) + if dstMapElm.IsValid() { + dstMapElm = reflect.ValueOf(dstMapElm.Interface()) + } + } + if err = deepMerge(dstMapElm, srcMapElm, visited, depth+1, config); err != nil { + return + } + case reflect.Slice: + srcSlice := reflect.ValueOf(srcElement.Interface()) + + var dstSlice reflect.Value + if !dstElement.IsValid() || dstElement.IsNil() { + dstSlice = reflect.MakeSlice(srcSlice.Type(), 0, srcSlice.Len()) + } else { + dstSlice = reflect.ValueOf(dstElement.Interface()) + } + + if !isEmptyValue(src) && (overwrite || isEmptyValue(dst)) && !config.AppendSlice { + dstSlice = srcSlice + } else if config.AppendSlice { + dstSlice = reflect.AppendSlice(dstSlice, srcSlice) + } + dst.SetMapIndex(key, dstSlice) } - continue } - if !srcElement.CanInterface() { + if dstElement.IsValid() && reflect.TypeOf(srcElement.Interface()).Kind() == reflect.Map { continue } - if srcElement.CanInterface() { - srcElement = reflect.ValueOf(srcElement.Interface()) - if dstElement.IsValid() { - dstElement = reflect.ValueOf(dstElement.Interface()) + if srcElement.IsValid() && (overwrite || (!dstElement.IsValid() || isEmptyValue(dstElement))) { + if dst.IsNil() { + dst.Set(reflect.MakeMap(dst.Type())) } + dst.SetMapIndex(key, srcElement) } - dstElement, err = deepMerge(dstElement, srcElement, visited, depth+1, config) - if err != nil { - return - } - dst.SetMapIndex(key, dstElement) - } case reflect.Slice: - newSlice := dst - if (!isEmptyValue(src) || overwriteWithEmptySrc || overwriteSliceWithEmptySrc) && (overwrite || isEmptyValue(dst)) && !config.AppendSlice { - if typeCheck && src.Type() != dst.Type() { - return dst, fmt.Errorf("cannot override two slices with different type (%s, %s)", src.Type(), dst.Type()) - } - newSlice = src + if !dst.CanSet() { + break + } + if !isEmptyValue(src) && (overwrite || isEmptyValue(dst)) && !config.AppendSlice { + dst.Set(src) } else if config.AppendSlice { - if typeCheck && src.Type() != dst.Type() { - err = fmt.Errorf("cannot append two slice with different type (%s, %s)", src.Type(), dst.Type()) - return - } - newSlice = reflect.AppendSlice(dst, src) + dst.Set(reflect.AppendSlice(dst, src)) } - if dst.CanSet() { - dst.Set(newSlice) - } else { - dst = newSlice - } - case reflect.Ptr, reflect.Interface: - if isReflectNil(src) { + case reflect.Ptr: + fallthrough + case reflect.Interface: + if src.IsNil() { break } - - if dst.Kind() != reflect.Ptr && src.Type().AssignableTo(dst.Type()) { - if dst.IsNil() || overwrite { - if overwrite || isEmptyValue(dst) { - if dst.CanSet() { - dst.Set(src) - } else { - dst = src - } - } - } - break - } - if src.Kind() != reflect.Interface { - if dst.IsNil() || (src.Kind() != reflect.Ptr && overwrite) { + if dst.IsNil() || overwrite { if dst.CanSet() && (overwrite || isEmptyValue(dst)) { dst.Set(src) } } else if src.Kind() == reflect.Ptr { - if dst, err = deepMerge(dst.Elem(), src.Elem(), visited, depth+1, config); err != nil { + if err = deepMerge(dst.Elem(), src.Elem(), visited, depth+1, config); err != nil { return } - dst = dst.Addr() } else if dst.Elem().Type() == src.Type() { - if dst, err = deepMerge(dst.Elem(), src, visited, depth+1, config); err != nil { + if err = deepMerge(dst.Elem(), src, visited, depth+1, config); err != nil { return } } else { - return dst, ErrDifferentArgumentsTypes + return ErrDifferentArgumentsTypes } break } if dst.IsNil() || overwrite { - if (overwrite || isEmptyValue(dst)) && (overwriteWithEmptySrc || !isEmptyValue(src)) { - if dst.CanSet() { - dst.Set(src) - } else { - dst = src - } + if dst.CanSet() && (overwrite || isEmptyValue(dst)) { + dst.Set(src) } - } else if _, err = deepMerge(dst.Elem(), src.Elem(), visited, depth+1, config); err != nil { + } else if err = deepMerge(dst.Elem(), src.Elem(), visited, depth+1, config); err != nil { return } default: - overwriteFull := (!isEmptyValue(src) || overwriteWithEmptySrc) && (overwrite || isEmptyValue(dst)) - if overwriteFull { - if dst.CanSet() { - dst.Set(src) - } else { - dst = src - } + if dst.CanSet() && !isEmptyValue(src) && (overwrite || isEmptyValue(dst)) { + dst.Set(src) } } - return } @@ -260,7 +199,7 @@ func Merge(dst, src interface{}, opts ...func(*Config)) error { return merge(dst, src, opts...) } -// MergeWithOverwrite will do the same as Merge except that non-empty dst attributes will be overridden by +// MergeWithOverwrite will do the same as Merge except that non-empty dst attributes will be overriden by // non-empty src attribute values. // Deprecated: use Merge(…) with WithOverride func MergeWithOverwrite(dst, src interface{}, opts ...func(*Config)) error { @@ -279,26 +218,11 @@ func WithOverride(config *Config) { config.Overwrite = true } -// WithOverwriteWithEmptyValue will make merge override non empty dst attributes with empty src attributes values. -func WithOverwriteWithEmptyValue(config *Config) { - config.overwriteWithEmptyValue = true -} - -// WithOverrideEmptySlice will make merge override empty dst slice with empty src slice. -func WithOverrideEmptySlice(config *Config) { - config.overwriteSliceWithEmptyValue = true -} - -// WithAppendSlice will make merge append slices instead of overwriting it. +// WithAppendSlice will make merge append slices instead of overwriting it func WithAppendSlice(config *Config) { config.AppendSlice = true } -// WithTypeCheck will make merge check types while overwriting it (must be used with WithOverride). -func WithTypeCheck(config *Config) { - config.TypeCheck = true -} - func merge(dst, src interface{}, opts ...func(*Config)) error { var ( vDst, vSrc reflect.Value @@ -314,25 +238,8 @@ func merge(dst, src interface{}, opts ...func(*Config)) error { if vDst, vSrc, err = resolveValues(dst, src); err != nil { return err } - if !vDst.CanSet() { - return fmt.Errorf("cannot set dst, needs reference") - } if vDst.Type() != vSrc.Type() { return ErrDifferentArgumentsTypes } - _, err = deepMerge(vDst, vSrc, make(map[uintptr]*visit), 0, config) - return err -} - -// IsReflectNil is the reflect value provided nil -func isReflectNil(v reflect.Value) bool { - k := v.Kind() - switch k { - case reflect.Interface, reflect.Slice, reflect.Chan, reflect.Func, reflect.Map, reflect.Ptr: - // Both interface and slice are nil if first word is 0. - // Both are always bigger than a word; assume flagIndir. - return v.IsNil() - default: - return false - } + return deepMerge(vDst, vSrc, make(map[uintptr]*visit), 0, config) } diff --git a/vendor/github.com/influxdata/tdigest/.gitignore b/vendor/github.com/influxdata/tdigest/.gitignore deleted file mode 100644 index 098cc7e3..00000000 --- a/vendor/github.com/influxdata/tdigest/.gitignore +++ /dev/null @@ -1 +0,0 @@ -/test/*.dat* diff --git a/vendor/github.com/influxdata/tdigest/LICENSE b/vendor/github.com/influxdata/tdigest/LICENSE deleted file mode 100644 index ebb2bfb1..00000000 --- a/vendor/github.com/influxdata/tdigest/LICENSE +++ /dev/null @@ -1,202 +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 2018 InfluxData 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/influxdata/tdigest/README.md b/vendor/github.com/influxdata/tdigest/README.md deleted file mode 100644 index fe19510e..00000000 --- a/vendor/github.com/influxdata/tdigest/README.md +++ /dev/null @@ -1,42 +0,0 @@ -# tdigest - -This is an implementation of Ted Dunning's [t-digest](https://github.com/tdunning/t-digest/) in Go. - -The implementation is based off [Derrick Burns' C++ implementation](https://github.com/derrickburns/tdigest). - -## Example - -```go -package main - -import ( - "log" - - "github.com/influxdata/tdigest" -) - -func main() { - td := tdigest.NewWithCompression(1000) - for _, x := range []float64{1, 2, 3, 4, 5, 5, 4, 3, 2, 1} { - td.Add(x, 1) - } - - // Compute Quantiles - log.Println("50th", td.Quantile(0.5)) - log.Println("75th", td.Quantile(0.75)) - log.Println("90th", td.Quantile(0.9)) - log.Println("99th", td.Quantile(0.99)) - - // Compute CDFs - log.Println("CDF(1) = ", td.CDF(1)) - log.Println("CDF(2) = ", td.CDF(2)) - log.Println("CDF(3) = ", td.CDF(3)) - log.Println("CDF(4) = ", td.CDF(4)) - log.Println("CDF(5) = ", td.CDF(5)) -} -``` - -## TODO - -Only the methods for a single TDigest have been implemented. -The methods to merge two or more existing t-digests into a single t-digest have yet to be implemented. diff --git a/vendor/github.com/influxdata/tdigest/centroid.go b/vendor/github.com/influxdata/tdigest/centroid.go deleted file mode 100644 index 88db1b46..00000000 --- a/vendor/github.com/influxdata/tdigest/centroid.go +++ /dev/null @@ -1,60 +0,0 @@ -package tdigest - -import ( - "fmt" - "sort" -) - -// ErrWeightLessThanZero is used when the weight is not able to be processed. -const ErrWeightLessThanZero = Error("centroid weight cannot be less than zero") - -// Error is a domain error encountered while processing tdigests -type Error string - -func (e Error) Error() string { - return string(e) -} - -// Centroid average position of all points in a shape -type Centroid struct { - Mean float64 - Weight float64 -} - -func (c *Centroid) String() string { - return fmt.Sprintf("{mean: %f weight: %f}", c.Mean, c.Weight) -} - -// Add averages the two centroids together and update this centroid -func (c *Centroid) Add(r Centroid) error { - if r.Weight < 0 { - return ErrWeightLessThanZero - } - if c.Weight != 0 { - c.Weight += r.Weight - c.Mean += r.Weight * (r.Mean - c.Mean) / c.Weight - } else { - c.Weight = r.Weight - c.Mean = r.Mean - } - return nil -} - -// CentroidList is sorted by the Mean of the centroid, ascending. -type CentroidList []Centroid - -// Clear clears the list. -func (l *CentroidList) Clear() { - *l = (*l)[:0] -} - -func (l CentroidList) Len() int { return len(l) } -func (l CentroidList) Less(i, j int) bool { return l[i].Mean < l[j].Mean } -func (l CentroidList) Swap(i, j int) { l[i], l[j] = l[j], l[i] } - -// NewCentroidList creates a priority queue for the centroids -func NewCentroidList(centroids []Centroid) CentroidList { - l := CentroidList(centroids) - sort.Sort(l) - return l -} diff --git a/vendor/github.com/influxdata/tdigest/go.mod b/vendor/github.com/influxdata/tdigest/go.mod deleted file mode 100644 index a9ac2697..00000000 --- a/vendor/github.com/influxdata/tdigest/go.mod +++ /dev/null @@ -1,10 +0,0 @@ -module github.com/influxdata/tdigest - -require ( - github.com/google/go-cmp v0.2.0 - golang.org/x/exp v0.0.0-20180321215751-8460e604b9de - gonum.org/v1/gonum v0.0.0-20181121035319-3f7ecaa7e8ca - gonum.org/v1/netlib v0.0.0-20181029234149-ec6d1f5cefe6 // indirect -) - -go 1.13 diff --git a/vendor/github.com/influxdata/tdigest/go.sum b/vendor/github.com/influxdata/tdigest/go.sum deleted file mode 100644 index 996169f1..00000000 --- a/vendor/github.com/influxdata/tdigest/go.sum +++ /dev/null @@ -1,9 +0,0 @@ -github.com/google/go-cmp v0.2.0 h1:+dTQ8DZQJz0Mb/HjFlkptS1FeQ4cWSnN941F8aEG4SQ= -github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= -golang.org/x/exp v0.0.0-20180321215751-8460e604b9de h1:xSjD6HQTqT0H/k60N5yYBtnN1OEkVy7WIo/DYyxKRO0= -golang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/tools v0.0.0-20180525024113-a5b4c53f6e8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -gonum.org/v1/gonum v0.0.0-20181121035319-3f7ecaa7e8ca h1:PupagGYwj8+I4ubCxcmcBRk3VlUWtTg5huQpZR9flmE= -gonum.org/v1/gonum v0.0.0-20181121035319-3f7ecaa7e8ca/go.mod h1:Y+Yx5eoAFn32cQvJDxZx5Dpnq+c3wtXuadVZAcxbbBo= -gonum.org/v1/netlib v0.0.0-20181029234149-ec6d1f5cefe6 h1:4WsZyVtkthqrHTbDCJfiTs8IWNYE4uvsSDgaV6xpp+o= -gonum.org/v1/netlib v0.0.0-20181029234149-ec6d1f5cefe6/go.mod h1:wa6Ws7BG/ESfp6dHfk7C6KdzKA7wR7u/rKwOGE66zvw= diff --git a/vendor/github.com/influxdata/tdigest/tdigest.go b/vendor/github.com/influxdata/tdigest/tdigest.go deleted file mode 100644 index 3de1c890..00000000 --- a/vendor/github.com/influxdata/tdigest/tdigest.go +++ /dev/null @@ -1,276 +0,0 @@ -package tdigest - -import ( - "math" - "sort" -) - -// TDigest is a data structure for accurate on-line accumulation of -// rank-based statistics such as quantiles and trimmed means. -type TDigest struct { - Compression float64 - - maxProcessed int - maxUnprocessed int - processed CentroidList - unprocessed CentroidList - cumulative []float64 - processedWeight float64 - unprocessedWeight float64 - min float64 - max float64 -} - -// New initializes a new distribution with a default compression. -func New() *TDigest { - return NewWithCompression(1000) -} - -// NewWithCompression initializes a new distribution with custom compression. -func NewWithCompression(c float64) *TDigest { - t := &TDigest{ - Compression: c, - } - t.maxProcessed = processedSize(0, t.Compression) - t.maxUnprocessed = unprocessedSize(0, t.Compression) - t.processed = make(CentroidList, 0, t.maxProcessed) - t.unprocessed = make(CentroidList, 0, t.maxUnprocessed+1) - t.Reset() - return t -} - -// Reset resets the distribution to its initial state. -func (t *TDigest) Reset() { - t.processed = t.processed[:0] - t.unprocessed = t.unprocessed[:0] - t.cumulative = t.cumulative[:0] - t.processedWeight = 0 - t.unprocessedWeight = 0 - t.min = math.MaxFloat64 - t.max = -math.MaxFloat64 -} - -// Add adds a value x with a weight w to the distribution. -func (t *TDigest) Add(x, w float64) { - if math.IsNaN(x) { - return - } - t.AddCentroid(Centroid{Mean: x, Weight: w}) -} - -// AddCentroidList can quickly add multiple centroids. -func (t *TDigest) AddCentroidList(c CentroidList) { - l := c.Len() - for i := 0; i < l; i++ { - diff := l - i - room := t.maxUnprocessed - t.unprocessed.Len() - mid := i + diff - if room < diff { - mid = i + room - } - for i < mid { - t.AddCentroid(c[i]) - i++ - } - } -} - -// AddCentroid adds a single centroid. -func (t *TDigest) AddCentroid(c Centroid) { - t.unprocessed = append(t.unprocessed, c) - t.unprocessedWeight += c.Weight - - if t.processed.Len() > t.maxProcessed || - t.unprocessed.Len() > t.maxUnprocessed { - t.process() - } -} - -func (t *TDigest) process() { - if t.unprocessed.Len() > 0 || - t.processed.Len() > t.maxProcessed { - - // Append all processed centroids to the unprocessed list and sort - t.unprocessed = append(t.unprocessed, t.processed...) - sort.Sort(&t.unprocessed) - - // Reset processed list with first centroid - t.processed.Clear() - t.processed = append(t.processed, t.unprocessed[0]) - - t.processedWeight += t.unprocessedWeight - t.unprocessedWeight = 0 - soFar := t.unprocessed[0].Weight - limit := t.processedWeight * t.integratedQ(1.0) - for _, centroid := range t.unprocessed[1:] { - projected := soFar + centroid.Weight - if projected <= limit { - soFar = projected - (&t.processed[t.processed.Len()-1]).Add(centroid) - } else { - k1 := t.integratedLocation(soFar / t.processedWeight) - limit = t.processedWeight * t.integratedQ(k1+1.0) - soFar += centroid.Weight - t.processed = append(t.processed, centroid) - } - } - t.min = math.Min(t.min, t.processed[0].Mean) - t.max = math.Max(t.max, t.processed[t.processed.Len()-1].Mean) - t.updateCumulative() - t.unprocessed.Clear() - } -} - -// Centroids returns a copy of processed centroids. -// Useful when aggregating multiple t-digests. -// -// Pass in the CentroidList as the buffer to write into. -func (t *TDigest) Centroids() CentroidList { - t.process() - cl := make([]Centroid, len(t.processed)) - copy(cl, t.processed) - return cl -} - -func (t *TDigest) Count() float64 { - t.process() - count := 0.0 - for _, centroid := range t.processed { - count += centroid.Weight - } - return count -} - -func (t *TDigest) updateCumulative() { - if n := t.processed.Len() + 1; n <= cap(t.cumulative) { - t.cumulative = t.cumulative[:n] - } else { - t.cumulative = make([]float64, n) - } - - prev := 0.0 - for i, centroid := range t.processed { - cur := centroid.Weight - t.cumulative[i] = prev + cur/2.0 - prev = prev + cur - } - t.cumulative[t.processed.Len()] = prev -} - -// Quantile returns the (approximate) quantile of -// the distribution. Accepted values for q are between 0.0 and 1.0. -// Returns NaN if Count is zero or bad inputs. -func (t *TDigest) Quantile(q float64) float64 { - t.process() - if q < 0 || q > 1 || t.processed.Len() == 0 { - return math.NaN() - } - if t.processed.Len() == 1 { - return t.processed[0].Mean - } - index := q * t.processedWeight - if index <= t.processed[0].Weight/2.0 { - return t.min + 2.0*index/t.processed[0].Weight*(t.processed[0].Mean-t.min) - } - - lower := sort.Search(len(t.cumulative), func(i int) bool { - return t.cumulative[i] >= index - }) - - if lower+1 != len(t.cumulative) { - z1 := index - t.cumulative[lower-1] - z2 := t.cumulative[lower] - index - return weightedAverage(t.processed[lower-1].Mean, z2, t.processed[lower].Mean, z1) - } - - z1 := index - t.processedWeight - t.processed[lower-1].Weight/2.0 - z2 := (t.processed[lower-1].Weight / 2.0) - z1 - return weightedAverage(t.processed[t.processed.Len()-1].Mean, z1, t.max, z2) -} - -// CDF returns the cumulative distribution function for a given value x. -func (t *TDigest) CDF(x float64) float64 { - t.process() - switch t.processed.Len() { - case 0: - return 0.0 - case 1: - width := t.max - t.min - if x <= t.min { - return 0.0 - } - if x >= t.max { - return 1.0 - } - if (x - t.min) <= width { - // min and max are too close together to do any viable interpolation - return 0.5 - } - return (x - t.min) / width - } - - if x <= t.min { - return 0.0 - } - if x >= t.max { - return 1.0 - } - m0 := t.processed[0].Mean - // Left Tail - if x <= m0 { - if m0-t.min > 0 { - return (x - t.min) / (m0 - t.min) * t.processed[0].Weight / t.processedWeight / 2.0 - } - return 0.0 - } - // Right Tail - mn := t.processed[t.processed.Len()-1].Mean - if x >= mn { - if t.max-mn > 0.0 { - return 1.0 - (t.max-x)/(t.max-mn)*t.processed[t.processed.Len()-1].Weight/t.processedWeight/2.0 - } - return 1.0 - } - - upper := sort.Search(t.processed.Len(), func(i int) bool { - return t.processed[i].Mean > x - }) - - z1 := x - t.processed[upper-1].Mean - z2 := t.processed[upper].Mean - x - return weightedAverage(t.cumulative[upper-1], z2, t.cumulative[upper], z1) / t.processedWeight -} - -func (t *TDigest) integratedQ(k float64) float64 { - return (math.Sin(math.Min(k, t.Compression)*math.Pi/t.Compression-math.Pi/2.0) + 1.0) / 2.0 -} - -func (t *TDigest) integratedLocation(q float64) float64 { - return t.Compression * (math.Asin(2.0*q-1.0) + math.Pi/2.0) / math.Pi -} - -func weightedAverage(x1, w1, x2, w2 float64) float64 { - if x1 <= x2 { - return weightedAverageSorted(x1, w1, x2, w2) - } - return weightedAverageSorted(x2, w2, x1, w1) -} - -func weightedAverageSorted(x1, w1, x2, w2 float64) float64 { - x := (x1*w1 + x2*w2) / (w1 + w2) - return math.Max(x1, math.Min(x, x2)) -} - -func processedSize(size int, compression float64) int { - if size == 0 { - return int(2 * math.Ceil(compression)) - } - return size -} - -func unprocessedSize(size int, compression float64) int { - if size == 0 { - return int(8 * math.Ceil(compression)) - } - return size -} diff --git a/vendor/github.com/josharian/intern/README.md b/vendor/github.com/josharian/intern/README.md deleted file mode 100644 index ffc44b21..00000000 --- a/vendor/github.com/josharian/intern/README.md +++ /dev/null @@ -1,5 +0,0 @@ -Docs: https://godoc.org/github.com/josharian/intern - -See also [Go issue 5160](https://golang.org/issue/5160). - -License: MIT diff --git a/vendor/github.com/josharian/intern/go.mod b/vendor/github.com/josharian/intern/go.mod deleted file mode 100644 index f2262ff0..00000000 --- a/vendor/github.com/josharian/intern/go.mod +++ /dev/null @@ -1,3 +0,0 @@ -module github.com/josharian/intern - -go 1.5 diff --git a/vendor/github.com/josharian/intern/intern.go b/vendor/github.com/josharian/intern/intern.go deleted file mode 100644 index 7acb1fe9..00000000 --- a/vendor/github.com/josharian/intern/intern.go +++ /dev/null @@ -1,44 +0,0 @@ -// Package intern interns strings. -// Interning is best effort only. -// Interned strings may be removed automatically -// at any time without notification. -// All functions may be called concurrently -// with themselves and each other. -package intern - -import "sync" - -var ( - pool sync.Pool = sync.Pool{ - New: func() interface{} { - return make(map[string]string) - }, - } -) - -// String returns s, interned. -func String(s string) string { - m := pool.Get().(map[string]string) - c, ok := m[s] - if ok { - pool.Put(m) - return c - } - m[s] = s - pool.Put(m) - return s -} - -// Bytes returns b converted to a string, interned. -func Bytes(b []byte) string { - m := pool.Get().(map[string]string) - c, ok := m[string(b)] - if ok { - pool.Put(m) - return c - } - s := string(b) - m[s] = s - pool.Put(m) - return s -} diff --git a/vendor/github.com/josharian/intern/license.md b/vendor/github.com/josharian/intern/license.md deleted file mode 100644 index 353d3055..00000000 --- a/vendor/github.com/josharian/intern/license.md +++ /dev/null @@ -1,21 +0,0 @@ -MIT License - -Copyright (c) 2019 Josh Bleecher Snyder - -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/mailru/easyjson/buffer/pool.go b/vendor/github.com/mailru/easyjson/buffer/pool.go index 598a54af..07fb4bc1 100644 --- a/vendor/github.com/mailru/easyjson/buffer/pool.go +++ b/vendor/github.com/mailru/easyjson/buffer/pool.go @@ -4,7 +4,6 @@ package buffer import ( "io" - "net" "sync" ) @@ -53,12 +52,14 @@ func putBuf(buf []byte) { // getBuf gets a chunk from reuse pool or creates a new one if reuse failed. func getBuf(size int) []byte { - if size >= config.PooledSize { - if c := buffers[size]; c != nil { - v := c.Get() - if v != nil { - return v.([]byte) - } + if size < config.PooledSize { + return make([]byte, 0, size) + } + + if c := buffers[size]; c != nil { + v := c.Get() + if v != nil { + return v.([]byte) } } return make([]byte, 0, size) @@ -77,12 +78,9 @@ type Buffer struct { // EnsureSpace makes sure that the current chunk contains at least s free bytes, // possibly creating a new chunk. func (b *Buffer) EnsureSpace(s int) { - if cap(b.Buf)-len(b.Buf) < s { - b.ensureSpaceSlow(s) + if cap(b.Buf)-len(b.Buf) >= s { + return } -} - -func (b *Buffer) ensureSpaceSlow(s int) { l := len(b.Buf) if l > 0 { if cap(b.toPool) != cap(b.Buf) { @@ -107,22 +105,18 @@ func (b *Buffer) ensureSpaceSlow(s int) { // AppendByte appends a single byte to buffer. func (b *Buffer) AppendByte(data byte) { - b.EnsureSpace(1) + if cap(b.Buf) == len(b.Buf) { // EnsureSpace won't be inlined. + b.EnsureSpace(1) + } b.Buf = append(b.Buf, data) } // AppendBytes appends a byte slice to buffer. func (b *Buffer) AppendBytes(data []byte) { - if len(data) <= cap(b.Buf)-len(b.Buf) { - b.Buf = append(b.Buf, data...) // fast path - } else { - b.appendBytesSlow(data) - } -} - -func (b *Buffer) appendBytesSlow(data []byte) { for len(data) > 0 { - b.EnsureSpace(1) + if cap(b.Buf) == len(b.Buf) { // EnsureSpace won't be inlined. + b.EnsureSpace(1) + } sz := cap(b.Buf) - len(b.Buf) if sz > len(data) { @@ -134,18 +128,12 @@ func (b *Buffer) appendBytesSlow(data []byte) { } } -// AppendString appends a string to buffer. +// AppendBytes appends a string to buffer. func (b *Buffer) AppendString(data string) { - if len(data) <= cap(b.Buf)-len(b.Buf) { - b.Buf = append(b.Buf, data...) // fast path - } else { - b.appendStringSlow(data) - } -} - -func (b *Buffer) appendStringSlow(data string) { for len(data) > 0 { - b.EnsureSpace(1) + if cap(b.Buf) == len(b.Buf) { // EnsureSpace won't be inlined. + b.EnsureSpace(1) + } sz := cap(b.Buf) - len(b.Buf) if sz > len(data) { @@ -168,22 +156,26 @@ func (b *Buffer) Size() int { // DumpTo outputs the contents of a buffer to a writer and resets the buffer. func (b *Buffer) DumpTo(w io.Writer) (written int, err error) { - bufs := net.Buffers(b.bufs) - if len(b.Buf) > 0 { - bufs = append(bufs, b.Buf) - } - n, err := bufs.WriteTo(w) - + var n int for _, buf := range b.bufs { + if err == nil { + n, err = w.Write(buf) + written += n + } putBuf(buf) } + + if err == nil { + n, err = w.Write(b.Buf) + written += n + } putBuf(b.toPool) b.bufs = nil b.Buf = nil b.toPool = nil - return int(n), err + return } // BuildBytes creates a single byte slice with all the contents of the buffer. Data is @@ -200,7 +192,7 @@ func (b *Buffer) BuildBytes(reuse ...[]byte) []byte { var ret []byte size := b.Size() - // If we got a buffer as argument and it is big enough, reuse it. + // If we got a buffer as argument and it is big enought, reuse it. if len(reuse) == 1 && cap(reuse[0]) >= size { ret = reuse[0][:0] } else { diff --git a/vendor/github.com/mailru/easyjson/jlexer/lexer.go b/vendor/github.com/mailru/easyjson/jlexer/lexer.go index b5f5e261..ddd376b8 100644 --- a/vendor/github.com/mailru/easyjson/jlexer/lexer.go +++ b/vendor/github.com/mailru/easyjson/jlexer/lexer.go @@ -5,7 +5,6 @@ package jlexer import ( - "bytes" "encoding/base64" "encoding/json" "errors" @@ -15,8 +14,6 @@ import ( "unicode" "unicode/utf16" "unicode/utf8" - - "github.com/josharian/intern" ) // tokenKind determines type of a token. @@ -35,10 +32,9 @@ const ( type token struct { kind tokenKind // Type of a token. - boolValue bool // Value if a boolean literal token. - byteValueCloned bool // true if byteValue was allocated and does not refer to original json body - byteValue []byte // Raw value of a token. - delimValue byte + boolValue bool // Value if a boolean literal token. + byteValue []byte // Raw value of a token. + delimValue byte } // Lexer is a JSON lexer: it iterates over JSON tokens in a byte slice. @@ -244,65 +240,23 @@ func (r *Lexer) fetchNumber() { // findStringLen tries to scan into the string literal for ending quote char to determine required size. // The size will be exact if no escapes are present and may be inexact if there are escaped chars. -func findStringLen(data []byte) (isValid bool, length int) { - for { - idx := bytes.IndexByte(data, '"') - if idx == -1 { - return false, len(data) +func findStringLen(data []byte) (isValid, hasEscapes bool, length int) { + delta := 0 + + for i := 0; i < len(data); i++ { + switch data[i] { + case '\\': + i++ + delta++ + if i < len(data) && data[i] == 'u' { + delta++ + } + case '"': + return true, (delta > 0), (i - delta) } - if idx == 0 || (idx > 0 && data[idx-1] != '\\') { - return true, length + idx - } - - // count \\\\\\\ sequences. even number of slashes means quote is not really escaped - cnt := 1 - for idx-cnt-1 >= 0 && data[idx-cnt-1] == '\\' { - cnt++ - } - if cnt%2 == 0 { - return true, length + idx - } - - length += idx + 1 - data = data[idx+1:] - } -} - -// unescapeStringToken performs unescaping of string token. -// if no escaping is needed, original string is returned, otherwise - a new one allocated -func (r *Lexer) unescapeStringToken() (err error) { - data := r.token.byteValue - var unescapedData []byte - - for { - i := bytes.IndexByte(data, '\\') - if i == -1 { - break - } - - escapedRune, escapedBytes, err := decodeEscape(data[i:]) - if err != nil { - r.errParse(err.Error()) - return err - } - - if unescapedData == nil { - unescapedData = make([]byte, 0, len(r.token.byteValue)) - } - - var d [4]byte - s := utf8.EncodeRune(d[:], escapedRune) - unescapedData = append(unescapedData, data[:i]...) - unescapedData = append(unescapedData, d[:s]...) - - data = data[i+escapedBytes:] } - if unescapedData != nil { - r.token.byteValue = append(unescapedData, data...) - r.token.byteValueCloned = true - } - return + return false, false, len(data) } // getu4 decodes \uXXXX from the beginning of s, returning the hex value, @@ -332,30 +286,36 @@ func getu4(s []byte) rune { return val } -// decodeEscape processes a single escape sequence and returns number of bytes processed. -func decodeEscape(data []byte) (decoded rune, bytesProcessed int, err error) { +// processEscape processes a single escape sequence and returns number of bytes processed. +func (r *Lexer) processEscape(data []byte) (int, error) { if len(data) < 2 { - return 0, 0, errors.New("incorrect escape symbol \\ at the end of token") + return 0, fmt.Errorf("syntax error at %v", string(data)) } c := data[1] switch c { case '"', '/', '\\': - return rune(c), 2, nil + r.token.byteValue = append(r.token.byteValue, c) + return 2, nil case 'b': - return '\b', 2, nil + r.token.byteValue = append(r.token.byteValue, '\b') + return 2, nil case 'f': - return '\f', 2, nil + r.token.byteValue = append(r.token.byteValue, '\f') + return 2, nil case 'n': - return '\n', 2, nil + r.token.byteValue = append(r.token.byteValue, '\n') + return 2, nil case 'r': - return '\r', 2, nil + r.token.byteValue = append(r.token.byteValue, '\r') + return 2, nil case 't': - return '\t', 2, nil + r.token.byteValue = append(r.token.byteValue, '\t') + return 2, nil case 'u': rr := getu4(data) if rr < 0 { - return 0, 0, errors.New("incorrectly escaped \\uXXXX sequence") + return 0, errors.New("syntax error") } read := 6 @@ -368,10 +328,13 @@ func decodeEscape(data []byte) (decoded rune, bytesProcessed int, err error) { rr = unicode.ReplacementChar } } - return rr, read, nil + var d [4]byte + s := utf8.EncodeRune(d[:], rr) + r.token.byteValue = append(r.token.byteValue, d[:s]...) + return read, nil } - return 0, 0, errors.New("incorrectly escaped bytes") + return 0, errors.New("syntax error") } // fetchString scans a string literal token. @@ -379,14 +342,43 @@ func (r *Lexer) fetchString() { r.pos++ data := r.Data[r.pos:] - isValid, length := findStringLen(data) + isValid, hasEscapes, length := findStringLen(data) if !isValid { r.pos += length r.errParse("unterminated string literal") return } - r.token.byteValue = data[:length] - r.pos += length + 1 // skip closing '"' as well + if !hasEscapes { + r.token.byteValue = data[:length] + r.pos += length + 1 + return + } + + r.token.byteValue = make([]byte, 0, length) + p := 0 + for i := 0; i < len(data); { + switch data[i] { + case '"': + r.pos += i + 1 + r.token.byteValue = append(r.token.byteValue, data[p:i]...) + i++ + return + + case '\\': + r.token.byteValue = append(r.token.byteValue, data[p:i]...) + off, err := r.processEscape(data[i:]) + if err != nil { + r.errParse(err.Error()) + return + } + i += off + p = i + + default: + i++ + } + } + r.errParse("unterminated string literal") } // scanToken scans the next token if no token is currently available in the lexer. @@ -401,7 +393,6 @@ func (r *Lexer) scanToken() { // consume resets the current token to allow scanning the next one. func (r *Lexer) consume() { r.token.kind = tokenUndef - r.token.byteValueCloned = false r.token.delimValue = 0 } @@ -529,7 +520,6 @@ func (r *Lexer) Skip() { func (r *Lexer) SkipRecursive() { r.scanToken() var start, end byte - startPos := r.start switch r.token.delimValue { case '{': @@ -555,14 +545,6 @@ func (r *Lexer) SkipRecursive() { level-- if level == 0 { r.pos += i + 1 - if !json.Valid(r.Data[startPos:r.pos]) { - r.pos = len(r.Data) - r.fatalError = &LexerError{ - Reason: "skipped array/object json value is invalid", - Offset: r.pos, - Data: string(r.Data[r.pos:]), - } - } return } case c == '\\' && inQuotes: @@ -620,7 +602,7 @@ func (r *Lexer) Consumed() { } } -func (r *Lexer) unsafeString(skipUnescape bool) (string, []byte) { +func (r *Lexer) unsafeString() (string, []byte) { if r.token.kind == tokenUndef && r.Ok() { r.FetchToken() } @@ -628,13 +610,6 @@ func (r *Lexer) unsafeString(skipUnescape bool) (string, []byte) { r.errInvalidToken("string") return "", nil } - if !skipUnescape { - if err := r.unescapeStringToken(); err != nil { - r.errInvalidToken("string") - return "", nil - } - } - bytes := r.token.byteValue ret := bytesToStr(r.token.byteValue) r.consume() @@ -646,19 +621,13 @@ func (r *Lexer) unsafeString(skipUnescape bool) (string, []byte) { // Warning: returned string may point to the input buffer, so the string should not outlive // the input buffer. Intended pattern of usage is as an argument to a switch statement. func (r *Lexer) UnsafeString() string { - ret, _ := r.unsafeString(false) + ret, _ := r.unsafeString() return ret } // UnsafeBytes returns the byte slice if the token is a string literal. func (r *Lexer) UnsafeBytes() []byte { - _, ret := r.unsafeString(false) - return ret -} - -// UnsafeFieldName returns current member name string token -func (r *Lexer) UnsafeFieldName(skipUnescape bool) string { - ret, _ := r.unsafeString(skipUnescape) + _, ret := r.unsafeString() return ret } @@ -671,34 +640,7 @@ func (r *Lexer) String() string { r.errInvalidToken("string") return "" } - if err := r.unescapeStringToken(); err != nil { - r.errInvalidToken("string") - return "" - } - var ret string - if r.token.byteValueCloned { - ret = bytesToStr(r.token.byteValue) - } else { - ret = string(r.token.byteValue) - } - r.consume() - return ret -} - -// StringIntern reads a string literal, and performs string interning on it. -func (r *Lexer) StringIntern() string { - if r.token.kind == tokenUndef && r.Ok() { - r.FetchToken() - } - if !r.Ok() || r.token.kind != tokenString { - r.errInvalidToken("string") - return "" - } - if err := r.unescapeStringToken(); err != nil { - r.errInvalidToken("string") - return "" - } - ret := intern.Bytes(r.token.byteValue) + ret := string(r.token.byteValue) r.consume() return ret } @@ -712,10 +654,6 @@ func (r *Lexer) Bytes() []byte { r.errInvalidToken("string") return nil } - if err := r.unescapeStringToken(); err != nil { - r.errInvalidToken("string") - return nil - } ret := make([]byte, base64.StdEncoding.DecodedLen(len(r.token.byteValue))) n, err := base64.StdEncoding.Decode(ret, r.token.byteValue) if err != nil { @@ -901,7 +839,7 @@ func (r *Lexer) Int() int { } func (r *Lexer) Uint8Str() uint8 { - s, b := r.unsafeString(false) + s, b := r.unsafeString() if !r.Ok() { return 0 } @@ -918,7 +856,7 @@ func (r *Lexer) Uint8Str() uint8 { } func (r *Lexer) Uint16Str() uint16 { - s, b := r.unsafeString(false) + s, b := r.unsafeString() if !r.Ok() { return 0 } @@ -935,7 +873,7 @@ func (r *Lexer) Uint16Str() uint16 { } func (r *Lexer) Uint32Str() uint32 { - s, b := r.unsafeString(false) + s, b := r.unsafeString() if !r.Ok() { return 0 } @@ -952,7 +890,7 @@ func (r *Lexer) Uint32Str() uint32 { } func (r *Lexer) Uint64Str() uint64 { - s, b := r.unsafeString(false) + s, b := r.unsafeString() if !r.Ok() { return 0 } @@ -977,7 +915,7 @@ func (r *Lexer) UintptrStr() uintptr { } func (r *Lexer) Int8Str() int8 { - s, b := r.unsafeString(false) + s, b := r.unsafeString() if !r.Ok() { return 0 } @@ -994,7 +932,7 @@ func (r *Lexer) Int8Str() int8 { } func (r *Lexer) Int16Str() int16 { - s, b := r.unsafeString(false) + s, b := r.unsafeString() if !r.Ok() { return 0 } @@ -1011,7 +949,7 @@ func (r *Lexer) Int16Str() int16 { } func (r *Lexer) Int32Str() int32 { - s, b := r.unsafeString(false) + s, b := r.unsafeString() if !r.Ok() { return 0 } @@ -1028,7 +966,7 @@ func (r *Lexer) Int32Str() int32 { } func (r *Lexer) Int64Str() int64 { - s, b := r.unsafeString(false) + s, b := r.unsafeString() if !r.Ok() { return 0 } @@ -1066,7 +1004,7 @@ func (r *Lexer) Float32() float32 { } func (r *Lexer) Float32Str() float32 { - s, b := r.unsafeString(false) + s, b := r.unsafeString() if !r.Ok() { return 0 } @@ -1099,7 +1037,7 @@ func (r *Lexer) Float64() float64 { } func (r *Lexer) Float64Str() float64 { - s, b := r.unsafeString(false) + s, b := r.unsafeString() if !r.Ok() { return 0 } diff --git a/vendor/github.com/mailru/easyjson/jwriter/writer.go b/vendor/github.com/mailru/easyjson/jwriter/writer.go index 2c5b2010..b9ed7cca 100644 --- a/vendor/github.com/mailru/easyjson/jwriter/writer.go +++ b/vendor/github.com/mailru/easyjson/jwriter/writer.go @@ -270,25 +270,16 @@ func (w *Writer) Bool(v bool) { const chars = "0123456789abcdef" -func getTable(falseValues ...int) [128]bool { - table := [128]bool{} - - for i := 0; i < 128; i++ { - table[i] = true +func isNotEscapedSingleChar(c byte, escapeHTML bool) bool { + // Note: might make sense to use a table if there are more chars to escape. With 4 chars + // it benchmarks the same. + if escapeHTML { + return c != '<' && c != '>' && c != '&' && c != '\\' && c != '"' && c >= 0x20 && c < utf8.RuneSelf + } else { + return c != '\\' && c != '"' && c >= 0x20 && c < utf8.RuneSelf } - - for _, v := range falseValues { - table[v] = false - } - - return table } -var ( - htmlEscapeTable = getTable(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, '"', '&', '<', '>', '\\') - htmlNoEscapeTable = getTable(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, '"', '\\') -) - func (w *Writer) String(s string) { w.Buffer.AppendByte('"') @@ -297,21 +288,15 @@ func (w *Writer) String(s string) { p := 0 // last non-escape symbol - escapeTable := &htmlEscapeTable - if w.NoEscapeHTML { - escapeTable = &htmlNoEscapeTable - } - for i := 0; i < len(s); { c := s[i] - if c < utf8.RuneSelf { - if escapeTable[c] { - // single-width character, no escaping is required - i++ - continue - } - + if isNotEscapedSingleChar(c, !w.NoEscapeHTML) { + // single-width character, no escaping is required + i++ + continue + } else if c < utf8.RuneSelf { + // single-with character, need to escape w.Buffer.AppendString(s[p:i]) switch c { case '\t': diff --git a/vendor/github.com/sergi/go-diff/AUTHORS b/vendor/github.com/sergi/go-diff/AUTHORS deleted file mode 100644 index 2d7bb2bf..00000000 --- a/vendor/github.com/sergi/go-diff/AUTHORS +++ /dev/null @@ -1,25 +0,0 @@ -# This is the official list of go-diff authors for copyright purposes. -# This file is distinct from the CONTRIBUTORS files. -# See the latter for an explanation. - -# Names should be added to this file as -# Name or Organization -# The email address is not required for organizations. - -# Please keep the list sorted. - -Danny Yoo -James Kolb -Jonathan Amsterdam -Markus Zimmermann -Matt Kovars -Örjan Persson -Osman Masood -Robert Carlsen -Rory Flynn -Sergi Mansilla -Shatrugna Sadhu -Shawn Smith -Stas Maksimov -Tor Arvid Lund -Zac Bergquist diff --git a/vendor/github.com/sergi/go-diff/CONTRIBUTORS b/vendor/github.com/sergi/go-diff/CONTRIBUTORS deleted file mode 100644 index 369e3d55..00000000 --- a/vendor/github.com/sergi/go-diff/CONTRIBUTORS +++ /dev/null @@ -1,32 +0,0 @@ -# This is the official list of people who can contribute -# (and typically have contributed) code to the go-diff -# repository. -# -# The AUTHORS file lists the copyright holders; this file -# lists people. For example, ACME Inc. employees would be listed here -# but not in AUTHORS, because ACME Inc. would hold the copyright. -# -# When adding J Random Contributor's name to this file, -# either J's name or J's organization's name should be -# added to the AUTHORS file. -# -# Names should be added to this file like so: -# Name -# -# Please keep the list sorted. - -Danny Yoo -James Kolb -Jonathan Amsterdam -Markus Zimmermann -Matt Kovars -Örjan Persson -Osman Masood -Robert Carlsen -Rory Flynn -Sergi Mansilla -Shatrugna Sadhu -Shawn Smith -Stas Maksimov -Tor Arvid Lund -Zac Bergquist diff --git a/vendor/github.com/sergi/go-diff/LICENSE b/vendor/github.com/sergi/go-diff/LICENSE deleted file mode 100644 index 937942c2..00000000 --- a/vendor/github.com/sergi/go-diff/LICENSE +++ /dev/null @@ -1,20 +0,0 @@ -Copyright (c) 2012-2016 The go-diff Authors. 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. - diff --git a/vendor/github.com/sergi/go-diff/diffmatchpatch/diff.go b/vendor/github.com/sergi/go-diff/diffmatchpatch/diff.go deleted file mode 100644 index cb25b437..00000000 --- a/vendor/github.com/sergi/go-diff/diffmatchpatch/diff.go +++ /dev/null @@ -1,1345 +0,0 @@ -// Copyright (c) 2012-2016 The go-diff authors. All rights reserved. -// https://github.com/sergi/go-diff -// See the included LICENSE file for license details. -// -// go-diff is a Go implementation of Google's Diff, Match, and Patch library -// Original library is Copyright (c) 2006 Google Inc. -// http://code.google.com/p/google-diff-match-patch/ - -package diffmatchpatch - -import ( - "bytes" - "errors" - "fmt" - "html" - "math" - "net/url" - "regexp" - "strconv" - "strings" - "time" - "unicode/utf8" -) - -// 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 - // DiffInsert item represents an insert diff. - DiffInsert Operation = 1 - // DiffEqual item represents an equal diff. - DiffEqual Operation = 0 -) - -// Diff represents one diff operation -type Diff struct { - Type Operation - 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 { - 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. -// If an invalid UTF-8 sequence is encountered, it will be replaced by the Unicode replacement character. -func (dmp *DiffMatchPatch) DiffMain(text1, text2 string, checklines bool) []Diff { - return dmp.DiffMainRunes([]rune(text1), []rune(text2), checklines) -} - -// DiffMainRunes finds the differences between two rune sequences. -// If an invalid UTF-8 sequence is encountered, it will be replaced by the Unicode replacement character. -func (dmp *DiffMatchPatch) DiffMainRunes(text1, text2 []rune, checklines bool) []Diff { - var deadline time.Time - if dmp.DiffTimeout > 0 { - deadline = time.Now().Add(dmp.DiffTimeout) - } - return dmp.diffMainRunes(text1, text2, checklines, deadline) -} - -func (dmp *DiffMatchPatch) diffMainRunes(text1, text2 []rune, checklines bool, deadline time.Time) []Diff { - if runesEqual(text1, text2) { - var diffs []Diff - if len(text1) > 0 { - diffs = append(diffs, Diff{DiffEqual, string(text1)}) - } - return diffs - } - // Trim off common prefix (speedup). - commonlength := commonPrefixLength(text1, text2) - commonprefix := text1[:commonlength] - text1 = text1[commonlength:] - text2 = text2[commonlength:] - - // Trim off common suffix (speedup). - commonlength = commonSuffixLength(text1, text2) - commonsuffix := text1[len(text1)-commonlength:] - text1 = text1[:len(text1)-commonlength] - text2 = text2[:len(text2)-commonlength] - - // Compute the diff on the middle block. - diffs := dmp.diffCompute(text1, text2, checklines, deadline) - - // Restore the prefix and suffix. - if len(commonprefix) != 0 { - diffs = append([]Diff{Diff{DiffEqual, string(commonprefix)}}, diffs...) - } - if len(commonsuffix) != 0 { - diffs = append(diffs, Diff{DiffEqual, string(commonsuffix)}) - } - - return dmp.DiffCleanupMerge(diffs) -} - -// diffCompute finds the differences between two rune slices. Assumes that the texts do not have any common prefix or suffix. -func (dmp *DiffMatchPatch) diffCompute(text1, text2 []rune, checklines bool, deadline time.Time) []Diff { - diffs := []Diff{} - if len(text1) == 0 { - // Just add some text (speedup). - return append(diffs, Diff{DiffInsert, string(text2)}) - } else if len(text2) == 0 { - // Just delete some text (speedup). - return append(diffs, Diff{DiffDelete, string(text1)}) - } - - var longtext, shorttext []rune - if len(text1) > len(text2) { - longtext = text1 - shorttext = text2 - } else { - longtext = text2 - shorttext = text1 - } - - if i := runesIndex(longtext, shorttext); i != -1 { - op := DiffInsert - // Swap insertions for deletions if diff is reversed. - if len(text1) > len(text2) { - op = DiffDelete - } - // Shorter text is inside the longer text (speedup). - return []Diff{ - Diff{op, string(longtext[:i])}, - Diff{DiffEqual, string(shorttext)}, - Diff{op, string(longtext[i+len(shorttext):])}, - } - } else if len(shorttext) == 1 { - // Single character string. - // After the previous speedup, the character can't be an equality. - return []Diff{ - Diff{DiffDelete, string(text1)}, - Diff{DiffInsert, string(text2)}, - } - // Check to see if the problem can be split in two. - } else if hm := dmp.diffHalfMatch(text1, text2); hm != nil { - // A half-match was found, sort out the return data. - text1A := hm[0] - text1B := hm[1] - text2A := hm[2] - text2B := hm[3] - midCommon := hm[4] - // Send both pairs off for separate processing. - diffsA := dmp.diffMainRunes(text1A, text2A, checklines, deadline) - diffsB := dmp.diffMainRunes(text1B, text2B, checklines, deadline) - // Merge the results. - 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) - } - return dmp.diffBisect(text1, text2, deadline) -} - -// diffLineMode does a quick line-level diff on both []runes, then rediff the parts for greater accuracy. This speedup can produce non-minimal diffs. -func (dmp *DiffMatchPatch) diffLineMode(text1, text2 []rune, deadline time.Time) []Diff { - // Scan the text on a line-by-line basis first. - text1, text2, linearray := dmp.diffLinesToRunes(text1, text2) - - diffs := dmp.diffMainRunes(text1, text2, false, deadline) - - // Convert the diff back to original text. - diffs = dmp.DiffCharsToLines(diffs, linearray) - // Eliminate freak matches (e.g. blank lines) - diffs = dmp.DiffCleanupSemantic(diffs) - - // Rediff any replacement blocks, this time character-by-character. - // Add a dummy entry at the end. - diffs = append(diffs, Diff{DiffEqual, ""}) - - pointer := 0 - countDelete := 0 - countInsert := 0 - - // NOTE: Rune slices are slower than using strings in this case. - textDelete := "" - textInsert := "" - - for pointer < len(diffs) { - switch diffs[pointer].Type { - case DiffInsert: - countInsert++ - textInsert += diffs[pointer].Text - case DiffDelete: - countDelete++ - textDelete += diffs[pointer].Text - case DiffEqual: - // Upon reaching an equality, check for prior redundancies. - if countDelete >= 1 && countInsert >= 1 { - // Delete the offending records and add the merged ones. - diffs = splice(diffs, pointer-countDelete-countInsert, - countDelete+countInsert) - - pointer = pointer - countDelete - countInsert - a := dmp.diffMainRunes([]rune(textDelete), []rune(textInsert), false, deadline) - for j := len(a) - 1; j >= 0; j-- { - diffs = splice(diffs, pointer, 0, a[j]) - } - pointer = pointer + len(a) - } - - countInsert = 0 - countDelete = 0 - textDelete = "" - textInsert = "" - } - pointer++ - } - - return diffs[:len(diffs)-1] // Remove the dummy entry at the end. -} - -// DiffBisect finds the 'middle snake' of a diff, split the problem in two and return the recursively constructed diff. -// If an invalid UTF-8 sequence is encountered, it will be replaced by the Unicode replacement character. -// See Myers 1986 paper: An O(ND) Difference Algorithm and Its Variations. -func (dmp *DiffMatchPatch) DiffBisect(text1, text2 string, deadline time.Time) []Diff { - // Unused in this code, but retained for interface compatibility. - return dmp.diffBisect([]rune(text1), []rune(text2), deadline) -} - -// diffBisect finds the 'middle snake' of a diff, splits the problem in two and returns the recursively constructed diff. -// See Myers's 1986 paper: An O(ND) Difference Algorithm and Its Variations. -func (dmp *DiffMatchPatch) diffBisect(runes1, runes2 []rune, deadline time.Time) []Diff { - // Cache the text lengths to prevent multiple calls. - runes1Len, runes2Len := len(runes1), len(runes2) - - maxD := (runes1Len + runes2Len + 1) / 2 - vOffset := maxD - vLength := 2 * maxD - - v1 := make([]int, vLength) - v2 := make([]int, vLength) - for i := range v1 { - v1[i] = -1 - v2[i] = -1 - } - v1[vOffset+1] = 0 - v2[vOffset+1] = 0 - - delta := runes1Len - runes2Len - // If the total number of characters is odd, then the front path will collide with the reverse path. - front := (delta%2 != 0) - // Offsets for start and end of k loop. Prevents mapping of space beyond the grid. - k1start := 0 - k1end := 0 - k2start := 0 - k2end := 0 - for d := 0; d < maxD; d++ { - // Bail out if deadline is reached. - if !deadline.IsZero() && d%16 == 0 && time.Now().After(deadline) { - break - } - - // Walk the front path one step. - for k1 := -d + k1start; k1 <= d-k1end; k1 += 2 { - k1Offset := vOffset + k1 - var x1 int - - if k1 == -d || (k1 != d && v1[k1Offset-1] < v1[k1Offset+1]) { - x1 = v1[k1Offset+1] - } else { - x1 = v1[k1Offset-1] + 1 - } - - y1 := x1 - k1 - for x1 < runes1Len && y1 < runes2Len { - if runes1[x1] != runes2[y1] { - break - } - x1++ - y1++ - } - v1[k1Offset] = x1 - if x1 > runes1Len { - // Ran off the right of the graph. - k1end += 2 - } else if y1 > runes2Len { - // Ran off the bottom of the graph. - k1start += 2 - } else if front { - k2Offset := vOffset + delta - k1 - if k2Offset >= 0 && k2Offset < vLength && v2[k2Offset] != -1 { - // Mirror x2 onto top-left coordinate system. - x2 := runes1Len - v2[k2Offset] - if x1 >= x2 { - // Overlap detected. - return dmp.diffBisectSplit(runes1, runes2, x1, y1, deadline) - } - } - } - } - // Walk the reverse path one step. - for k2 := -d + k2start; k2 <= d-k2end; k2 += 2 { - k2Offset := vOffset + k2 - var x2 int - if k2 == -d || (k2 != d && v2[k2Offset-1] < v2[k2Offset+1]) { - x2 = v2[k2Offset+1] - } else { - x2 = v2[k2Offset-1] + 1 - } - var y2 = x2 - k2 - for x2 < runes1Len && y2 < runes2Len { - if runes1[runes1Len-x2-1] != runes2[runes2Len-y2-1] { - break - } - x2++ - y2++ - } - v2[k2Offset] = x2 - if x2 > runes1Len { - // Ran off the left of the graph. - k2end += 2 - } else if y2 > runes2Len { - // Ran off the top of the graph. - k2start += 2 - } else if !front { - k1Offset := vOffset + delta - k2 - if k1Offset >= 0 && k1Offset < vLength && v1[k1Offset] != -1 { - x1 := v1[k1Offset] - y1 := vOffset + x1 - k1Offset - // Mirror x2 onto top-left coordinate system. - x2 = runes1Len - x2 - if x1 >= x2 { - // Overlap detected. - return dmp.diffBisectSplit(runes1, runes2, x1, y1, deadline) - } - } - } - } - } - // Diff took too long and hit the deadline or number of diffs equals number of characters, no commonality at all. - return []Diff{ - Diff{DiffDelete, string(runes1)}, - Diff{DiffInsert, string(runes2)}, - } -} - -func (dmp *DiffMatchPatch) diffBisectSplit(runes1, runes2 []rune, x, y int, - deadline time.Time) []Diff { - runes1a := runes1[:x] - runes2a := runes2[:y] - runes1b := runes1[x:] - runes2b := runes2[y:] - - // Compute both diffs serially. - diffs := dmp.diffMainRunes(runes1a, runes2a, false, deadline) - diffsb := dmp.diffMainRunes(runes1b, runes2b, false, deadline) - - return append(diffs, diffsb...) -} - -// DiffLinesToChars splits two texts into a list of strings, and educes the texts to a string of hashes where each Unicode character represents one line. -// It's slightly faster to call DiffLinesToRunes first, followed by DiffMainRunes. -func (dmp *DiffMatchPatch) DiffLinesToChars(text1, text2 string) (string, string, []string) { - chars1, chars2, lineArray := dmp.DiffLinesToRunes(text1, text2) - return string(chars1), string(chars2), lineArray -} - -// DiffLinesToRunes splits two texts into a list of runes. Each rune represents one line. -func (dmp *DiffMatchPatch) DiffLinesToRunes(text1, text2 string) ([]rune, []rune, []string) { - // '\x00' is a valid character, but various debuggers don't like it. So we'll insert a junk entry to avoid generating a null character. - lineArray := []string{""} // e.g. lineArray[4] == 'Hello\n' - lineHash := map[string]int{} // e.g. lineHash['Hello\n'] == 4 - - chars1 := dmp.diffLinesToRunesMunge(text1, &lineArray, lineHash) - chars2 := dmp.diffLinesToRunesMunge(text2, &lineArray, lineHash) - - return chars1, chars2, lineArray -} - -func (dmp *DiffMatchPatch) diffLinesToRunes(text1, text2 []rune) ([]rune, []rune, []string) { - return dmp.DiffLinesToRunes(string(text1), string(text2)) -} - -// diffLinesToRunesMunge splits a text into an array of strings, and reduces the texts to a []rune where each Unicode character represents one line. -// We use strings instead of []runes as input mainly because you can't use []rune as a map key. -func (dmp *DiffMatchPatch) diffLinesToRunesMunge(text string, lineArray *[]string, lineHash map[string]int) []rune { - // Walk the text, pulling out a substring for each line. text.split('\n') would would temporarily double our memory footprint. Modifying text would create many large strings to garbage collect. - lineStart := 0 - lineEnd := -1 - runes := []rune{} - - for lineEnd < len(text)-1 { - lineEnd = indexOf(text, "\n", lineStart) - - if lineEnd == -1 { - lineEnd = len(text) - 1 - } - - line := text[lineStart : lineEnd+1] - lineStart = lineEnd + 1 - lineValue, ok := lineHash[line] - - if ok { - runes = append(runes, rune(lineValue)) - } else { - *lineArray = append(*lineArray, line) - lineHash[line] = len(*lineArray) - 1 - runes = append(runes, rune(len(*lineArray)-1)) - } - } - - return runes -} - -// DiffCharsToLines rehydrates the text in a diff from a string of line hashes to real lines of text. -func (dmp *DiffMatchPatch) DiffCharsToLines(diffs []Diff, lineArray []string) []Diff { - hydrated := make([]Diff, 0, len(diffs)) - for _, aDiff := range diffs { - chars := aDiff.Text - text := make([]string, len(chars)) - - for i, r := range chars { - text[i] = lineArray[r] - } - - aDiff.Text = strings.Join(text, "") - hydrated = append(hydrated, aDiff) - } - return hydrated -} - -// DiffCommonPrefix determines the common prefix length of two strings. -func (dmp *DiffMatchPatch) DiffCommonPrefix(text1, text2 string) int { - // Unused in this code, but retained for interface compatibility. - return commonPrefixLength([]rune(text1), []rune(text2)) -} - -// DiffCommonSuffix determines the common suffix length of two strings. -func (dmp *DiffMatchPatch) DiffCommonSuffix(text1, text2 string) int { - // Unused in this code, but retained for interface compatibility. - return commonSuffixLength([]rune(text1), []rune(text2)) -} - -// commonPrefixLength returns the length of the common prefix of two rune slices. -func commonPrefixLength(text1, text2 []rune) int { - // Linear search. See comment in commonSuffixLength. - n := 0 - for ; n < len(text1) && n < len(text2); n++ { - if text1[n] != text2[n] { - return n - } - } - return n -} - -// commonSuffixLength returns the length of the common suffix of two rune slices. -func commonSuffixLength(text1, text2 []rune) int { - // 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 - } - } -} - -// DiffCommonOverlap determines if the suffix of one string is the prefix of another. -func (dmp *DiffMatchPatch) DiffCommonOverlap(text1 string, text2 string) int { - // Cache the text lengths to prevent multiple calls. - text1Length := len(text1) - text2Length := len(text2) - // Eliminate the null case. - if text1Length == 0 || text2Length == 0 { - return 0 - } - // Truncate the longer string. - if text1Length > text2Length { - text1 = text1[text1Length-text2Length:] - } else if text1Length < text2Length { - text2 = text2[0:text1Length] - } - textLength := int(math.Min(float64(text1Length), float64(text2Length))) - // Quick check for the worst case. - if text1 == text2 { - return textLength - } - - // Start by looking for a single character match and increase length until no match is found. Performance analysis: http://neil.fraser.name/news/2010/11/04/ - best := 0 - length := 1 - for { - pattern := text1[textLength-length:] - found := strings.Index(text2, pattern) - if found == -1 { - break - } - length += found - if found == 0 || text1[textLength-length:] == text2[0:length] { - best = length - length++ - } - } - - return best -} - -// DiffHalfMatch checks whether the two texts share a substring which is at least half the length of the longer text. This speedup can produce non-minimal diffs. -func (dmp *DiffMatchPatch) DiffHalfMatch(text1, text2 string) []string { - // Unused in this code, but retained for interface compatibility. - runeSlices := dmp.diffHalfMatch([]rune(text1), []rune(text2)) - if runeSlices == nil { - return nil - } - - result := make([]string, len(runeSlices)) - for i, r := range runeSlices { - result[i] = string(r) - } - return result -} - -func (dmp *DiffMatchPatch) diffHalfMatch(text1, text2 []rune) [][]rune { - if dmp.DiffTimeout <= 0 { - // Don't risk returning a non-optimal diff if we have unlimited time. - return nil - } - - var longtext, shorttext []rune - if len(text1) > len(text2) { - longtext = text1 - shorttext = text2 - } else { - longtext = text2 - shorttext = text1 - } - - if len(longtext) < 4 || len(shorttext)*2 < len(longtext) { - return nil // Pointless. - } - - // First check if the second quarter is the seed for a half-match. - hm1 := dmp.diffHalfMatchI(longtext, shorttext, int(float64(len(longtext)+3)/4)) - - // Check again based on the third quarter. - hm2 := dmp.diffHalfMatchI(longtext, shorttext, int(float64(len(longtext)+1)/2)) - - hm := [][]rune{} - if hm1 == nil && hm2 == nil { - return nil - } else if hm2 == nil { - hm = hm1 - } else if hm1 == nil { - hm = hm2 - } else { - // Both matched. Select the longest. - if len(hm1[4]) > len(hm2[4]) { - hm = hm1 - } else { - hm = hm2 - } - } - - // A half-match was found, sort out the return data. - if len(text1) > len(text2) { - return hm - } - - return [][]rune{hm[2], hm[3], hm[0], hm[1], hm[4]} -} - -// diffHalfMatchI checks if a substring of shorttext exist within longtext such that the substring is at least half the length of longtext? -// Returns a slice containing the prefix of longtext, the suffix of longtext, the prefix of shorttext, the suffix of shorttext and the common middle, or null if there was no match. -func (dmp *DiffMatchPatch) diffHalfMatchI(l, s []rune, i int) [][]rune { - var bestCommonA []rune - var bestCommonB []rune - var bestCommonLen int - var bestLongtextA []rune - var bestLongtextB []rune - var bestShorttextA []rune - var bestShorttextB []rune - - // Start with a 1/4 length substring at position i as a seed. - seed := l[i : i+len(l)/4] - - for j := runesIndexOf(s, seed, 0); j != -1; j = runesIndexOf(s, seed, j+1) { - prefixLength := commonPrefixLength(l[i:], s[j:]) - suffixLength := commonSuffixLength(l[:i], s[:j]) - - if bestCommonLen < suffixLength+prefixLength { - bestCommonA = s[j-suffixLength : j] - bestCommonB = s[j : j+prefixLength] - bestCommonLen = len(bestCommonA) + len(bestCommonB) - bestLongtextA = l[:i-suffixLength] - bestLongtextB = l[i+prefixLength:] - bestShorttextA = s[:j-suffixLength] - bestShorttextB = s[j+prefixLength:] - } - } - - if bestCommonLen*2 < len(l) { - return nil - } - - return [][]rune{ - bestLongtextA, - bestLongtextB, - bestShorttextA, - bestShorttextB, - append(bestCommonA, bestCommonB...), - } -} - -// DiffCleanupSemantic reduces the number of edits by eliminating semantically trivial equalities. -func (dmp *DiffMatchPatch) DiffCleanupSemantic(diffs []Diff) []Diff { - changes := false - // Stack of indices where equalities are found. - equalities := make([]int, 0, len(diffs)) - - var lastequality string - // Always equal to diffs[equalities[equalitiesLength - 1]][1] - var pointer int // Index of current position. - // Number of characters that changed prior to the equality. - var lengthInsertions1, lengthDeletions1 int - // Number of characters that changed after the equality. - var lengthInsertions2, lengthDeletions2 int - - for pointer < len(diffs) { - if diffs[pointer].Type == DiffEqual { - // Equality found. - equalities = append(equalities, pointer) - lengthInsertions1 = lengthInsertions2 - lengthDeletions1 = lengthDeletions2 - lengthInsertions2 = 0 - lengthDeletions2 = 0 - lastequality = diffs[pointer].Text - } else { - // An insertion or deletion. - - if diffs[pointer].Type == DiffInsert { - lengthInsertions2 += len(diffs[pointer].Text) - } else { - lengthDeletions2 += len(diffs[pointer].Text) - } - // Eliminate an equality that is smaller or equal to the edits on both sides of it. - difference1 := int(math.Max(float64(lengthInsertions1), float64(lengthDeletions1))) - difference2 := int(math.Max(float64(lengthInsertions2), float64(lengthDeletions2))) - if len(lastequality) > 0 && - (len(lastequality) <= difference1) && - (len(lastequality) <= difference2) { - // Duplicate record. - 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[:len(equalities)-1] - - if len(equalities) > 0 { - equalities = equalities[:len(equalities)-1] - } - pointer = -1 - if len(equalities) > 0 { - pointer = equalities[len(equalities)-1] - } - - lengthInsertions1 = 0 // Reset the counters. - lengthDeletions1 = 0 - lengthInsertions2 = 0 - lengthDeletions2 = 0 - lastequality = "" - changes = true - } - } - pointer++ - } - - // Normalize the diff. - if changes { - diffs = dmp.DiffCleanupMerge(diffs) - } - diffs = dmp.DiffCleanupSemanticLossless(diffs) - // Find any overlaps between deletions and insertions. - // e.g: abcxxxxxxdef - // -> abcxxxdef - // e.g: xxxabcdefxxx - // -> defxxxabc - // Only extract an overlap if it is as big as the edit ahead or behind it. - pointer = 1 - for pointer < len(diffs) { - if diffs[pointer-1].Type == DiffDelete && - diffs[pointer].Type == DiffInsert { - deletion := diffs[pointer-1].Text - insertion := diffs[pointer].Text - overlapLength1 := dmp.DiffCommonOverlap(deletion, insertion) - overlapLength2 := dmp.DiffCommonOverlap(insertion, deletion) - if overlapLength1 >= overlapLength2 { - if float64(overlapLength1) >= float64(len(deletion))/2 || - float64(overlapLength1) >= float64(len(insertion))/2 { - - // Overlap found. Insert an equality and trim the surrounding edits. - diffs = splice(diffs, pointer, 0, Diff{DiffEqual, insertion[:overlapLength1]}) - diffs[pointer-1].Text = - deletion[0 : len(deletion)-overlapLength1] - diffs[pointer+1].Text = insertion[overlapLength1:] - pointer++ - } - } else { - if float64(overlapLength2) >= float64(len(deletion))/2 || - 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 = splice(diffs, pointer, 0, overlap) - diffs[pointer-1].Type = DiffInsert - diffs[pointer-1].Text = insertion[0 : len(insertion)-overlapLength2] - diffs[pointer+1].Type = DiffDelete - diffs[pointer+1].Text = deletion[overlapLength2:] - pointer++ - } - } - pointer++ - } - pointer++ - } - - return diffs -} - -// Define some regex patterns for matching boundaries. -var ( - nonAlphaNumericRegex = regexp.MustCompile(`[^a-zA-Z0-9]`) - whitespaceRegex = regexp.MustCompile(`\s`) - linebreakRegex = regexp.MustCompile(`[\r\n]`) - blanklineEndRegex = regexp.MustCompile(`\n\r?\n$`) - blanklineStartRegex = regexp.MustCompile(`^\r?\n\r?\n`) -) - -// diffCleanupSemanticScore computes a score representing whether the internal boundary falls on logical boundaries. -// Scores range from 6 (best) to 0 (worst). Closure, but does not reference any external variables. -func diffCleanupSemanticScore(one, two string) int { - if len(one) == 0 || len(two) == 0 { - // Edges are the best. - return 6 - } - - // Each port of this function behaves slightly differently due to subtle differences in each language's definition of things like 'whitespace'. Since this function's purpose is largely cosmetic, the choice has been made to use each language's native features rather than force total conformity. - rune1, _ := utf8.DecodeLastRuneInString(one) - rune2, _ := utf8.DecodeRuneInString(two) - char1 := string(rune1) - char2 := string(rune2) - - nonAlphaNumeric1 := nonAlphaNumericRegex.MatchString(char1) - nonAlphaNumeric2 := nonAlphaNumericRegex.MatchString(char2) - whitespace1 := nonAlphaNumeric1 && whitespaceRegex.MatchString(char1) - whitespace2 := nonAlphaNumeric2 && whitespaceRegex.MatchString(char2) - lineBreak1 := whitespace1 && linebreakRegex.MatchString(char1) - lineBreak2 := whitespace2 && linebreakRegex.MatchString(char2) - blankLine1 := lineBreak1 && blanklineEndRegex.MatchString(one) - blankLine2 := lineBreak2 && blanklineEndRegex.MatchString(two) - - if blankLine1 || blankLine2 { - // Five points for blank lines. - return 5 - } else if lineBreak1 || lineBreak2 { - // Four points for line breaks. - return 4 - } else if nonAlphaNumeric1 && !whitespace1 && whitespace2 { - // Three points for end of sentences. - return 3 - } else if whitespace1 || whitespace2 { - // Two points for whitespace. - return 2 - } else if nonAlphaNumeric1 || nonAlphaNumeric2 { - // One point for non-alphanumeric. - return 1 - } - return 0 -} - -// DiffCleanupSemanticLossless looks for single edits surrounded on both sides by equalities which can be shifted sideways to align the edit to a word boundary. -// E.g: The cat came. -> The cat came. -func (dmp *DiffMatchPatch) DiffCleanupSemanticLossless(diffs []Diff) []Diff { - pointer := 1 - - // Intentionally ignore the first and last element (don't need checking). - for pointer < len(diffs)-1 { - if diffs[pointer-1].Type == DiffEqual && - diffs[pointer+1].Type == DiffEqual { - - // This is a single edit surrounded by equalities. - equality1 := diffs[pointer-1].Text - edit := diffs[pointer].Text - equality2 := diffs[pointer+1].Text - - // First, shift the edit as far left as possible. - commonOffset := dmp.DiffCommonSuffix(equality1, edit) - if commonOffset > 0 { - commonString := edit[len(edit)-commonOffset:] - equality1 = equality1[0 : len(equality1)-commonOffset] - edit = commonString + edit[:len(edit)-commonOffset] - equality2 = commonString + equality2 - } - - // Second, step character by character right, looking for the best fit. - bestEquality1 := equality1 - bestEdit := edit - bestEquality2 := equality2 - bestScore := diffCleanupSemanticScore(equality1, edit) + - diffCleanupSemanticScore(edit, equality2) - - for len(edit) != 0 && len(equality2) != 0 { - _, sz := utf8.DecodeRuneInString(edit) - if len(equality2) < sz || edit[:sz] != equality2[:sz] { - break - } - equality1 += edit[:sz] - edit = edit[sz:] + equality2[:sz] - equality2 = equality2[sz:] - score := diffCleanupSemanticScore(equality1, edit) + - diffCleanupSemanticScore(edit, equality2) - // The >= encourages trailing rather than leading whitespace on edits. - if score >= bestScore { - bestScore = score - bestEquality1 = equality1 - bestEdit = edit - bestEquality2 = equality2 - } - } - - if diffs[pointer-1].Text != bestEquality1 { - // We have an improvement, save it back to the diff. - if len(bestEquality1) != 0 { - diffs[pointer-1].Text = bestEquality1 - } else { - diffs = splice(diffs, pointer-1, 1) - pointer-- - } - - diffs[pointer].Text = bestEdit - if len(bestEquality2) != 0 { - diffs[pointer+1].Text = bestEquality2 - } else { - diffs = append(diffs[:pointer+1], diffs[pointer+2:]...) - pointer-- - } - } - } - pointer++ - } - - return diffs -} - -// DiffCleanupEfficiency reduces the number of edits by eliminating operationally trivial equalities. -func (dmp *DiffMatchPatch) DiffCleanupEfficiency(diffs []Diff) []Diff { - changes := false - // Stack of indices where equalities are found. - type equality struct { - data int - next *equality - } - var equalities *equality - // Always equal to equalities[equalitiesLength-1][1] - lastequality := "" - pointer := 0 // Index of current position. - // Is there an insertion operation before the last equality. - preIns := false - // Is there a deletion operation before the last equality. - preDel := false - // Is there an insertion operation after the last equality. - postIns := false - // Is there a deletion operation after the last equality. - postDel := false - for pointer < len(diffs) { - if diffs[pointer].Type == DiffEqual { // Equality found. - if len(diffs[pointer].Text) < dmp.DiffEditCost && - (postIns || postDel) { - // Candidate found. - equalities = &equality{ - data: pointer, - next: equalities, - } - preIns = postIns - preDel = postDel - lastequality = diffs[pointer].Text - } else { - // Not a candidate, and can never become one. - equalities = nil - lastequality = "" - } - postIns = false - postDel = false - } else { // An insertion or deletion. - if diffs[pointer].Type == DiffDelete { - postDel = true - } else { - postIns = true - } - - // Five types to be split: - // ABXYCD - // AXCD - // ABXC - // AXCD - // ABXC - var sumPres int - if preIns { - sumPres++ - } - if preDel { - sumPres++ - } - if postIns { - sumPres++ - } - if postDel { - sumPres++ - } - if len(lastequality) > 0 && - ((preIns && preDel && postIns && postDel) || - ((len(lastequality) < dmp.DiffEditCost/2) && sumPres == 3)) { - - insPoint := equalities.data - - // Duplicate record. - 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 - lastequality = "" - - if preIns && preDel { - // No changes made which could affect previous entry, keep going. - postIns = true - postDel = true - equalities = nil - } else { - if equalities != nil { - equalities = equalities.next - } - if equalities != nil { - pointer = equalities.data - } else { - pointer = -1 - } - postIns = false - postDel = false - } - changes = true - } - } - pointer++ - } - - if changes { - diffs = dmp.DiffCleanupMerge(diffs) - } - - return diffs -} - -// DiffCleanupMerge reorders and merges like edit sections. Merge equalities. -// Any edit section can move as long as it doesn't cross an equality. -func (dmp *DiffMatchPatch) DiffCleanupMerge(diffs []Diff) []Diff { - // Add a dummy entry at the end. - diffs = append(diffs, Diff{DiffEqual, ""}) - pointer := 0 - countDelete := 0 - countInsert := 0 - commonlength := 0 - textDelete := []rune(nil) - textInsert := []rune(nil) - - for pointer < len(diffs) { - switch diffs[pointer].Type { - case DiffInsert: - countInsert++ - textInsert = append(textInsert, []rune(diffs[pointer].Text)...) - pointer++ - break - case DiffDelete: - countDelete++ - textDelete = append(textDelete, []rune(diffs[pointer].Text)...) - pointer++ - break - case DiffEqual: - // Upon reaching an equality, check for prior redundancies. - if countDelete+countInsert > 1 { - if countDelete != 0 && countInsert != 0 { - // Factor out any common prefixies. - commonlength = commonPrefixLength(textInsert, textDelete) - if commonlength != 0 { - x := pointer - countDelete - countInsert - if x > 0 && diffs[x-1].Type == DiffEqual { - diffs[x-1].Text += string(textInsert[:commonlength]) - } else { - diffs = append([]Diff{Diff{DiffEqual, string(textInsert[:commonlength])}}, diffs...) - pointer++ - } - textInsert = textInsert[commonlength:] - textDelete = textDelete[commonlength:] - } - // Factor out any common suffixies. - commonlength = commonSuffixLength(textInsert, textDelete) - if commonlength != 0 { - insertIndex := len(textInsert) - commonlength - deleteIndex := len(textDelete) - commonlength - diffs[pointer].Text = string(textInsert[insertIndex:]) + diffs[pointer].Text - textInsert = textInsert[:insertIndex] - textDelete = textDelete[:deleteIndex] - } - } - // Delete the offending records and add the merged ones. - if countDelete == 0 { - diffs = splice(diffs, pointer-countInsert, - countDelete+countInsert, - Diff{DiffInsert, string(textInsert)}) - } else if countInsert == 0 { - diffs = splice(diffs, pointer-countDelete, - countDelete+countInsert, - Diff{DiffDelete, string(textDelete)}) - } else { - diffs = splice(diffs, pointer-countDelete-countInsert, - countDelete+countInsert, - Diff{DiffDelete, string(textDelete)}, - Diff{DiffInsert, string(textInsert)}) - } - - pointer = pointer - countDelete - countInsert + 1 - if countDelete != 0 { - pointer++ - } - if countInsert != 0 { - pointer++ - } - } else if pointer != 0 && diffs[pointer-1].Type == DiffEqual { - // Merge this equality with the previous one. - diffs[pointer-1].Text += diffs[pointer].Text - diffs = append(diffs[:pointer], diffs[pointer+1:]...) - } else { - pointer++ - } - countInsert = 0 - countDelete = 0 - textDelete = nil - textInsert = nil - break - } - } - - if len(diffs[len(diffs)-1].Text) == 0 { - diffs = diffs[0 : len(diffs)-1] // Remove the dummy entry at the end. - } - - // Second pass: look for single edits surrounded on both sides by equalities which can be shifted sideways to eliminate an equality. E.g: ABAC -> ABAC - changes := false - pointer = 1 - // Intentionally ignore the first and last element (don't need checking). - for pointer < (len(diffs) - 1) { - if diffs[pointer-1].Type == DiffEqual && - diffs[pointer+1].Type == DiffEqual { - // This is a single edit surrounded by equalities. - if strings.HasSuffix(diffs[pointer].Text, diffs[pointer-1].Text) { - // Shift the edit over the previous equality. - diffs[pointer].Text = diffs[pointer-1].Text + - diffs[pointer].Text[:len(diffs[pointer].Text)-len(diffs[pointer-1].Text)] - diffs[pointer+1].Text = diffs[pointer-1].Text + diffs[pointer+1].Text - diffs = splice(diffs, pointer-1, 1) - changes = true - } else if strings.HasPrefix(diffs[pointer].Text, diffs[pointer+1].Text) { - // Shift the edit over the next equality. - diffs[pointer-1].Text += diffs[pointer+1].Text - diffs[pointer].Text = - diffs[pointer].Text[len(diffs[pointer+1].Text):] + diffs[pointer+1].Text - diffs = splice(diffs, pointer+1, 1) - changes = true - } - } - pointer++ - } - - // If shifts were made, the diff needs reordering and another shift sweep. - if changes { - diffs = dmp.DiffCleanupMerge(diffs) - } - - return diffs -} - -// DiffXIndex returns the equivalent location in s2. -func (dmp *DiffMatchPatch) DiffXIndex(diffs []Diff, loc int) int { - chars1 := 0 - chars2 := 0 - lastChars1 := 0 - lastChars2 := 0 - lastDiff := Diff{} - for i := 0; i < len(diffs); i++ { - aDiff := diffs[i] - if aDiff.Type != DiffInsert { - // Equality or deletion. - chars1 += len(aDiff.Text) - } - if aDiff.Type != DiffDelete { - // Equality or insertion. - chars2 += len(aDiff.Text) - } - if chars1 > loc { - // Overshot the location. - lastDiff = aDiff - break - } - lastChars1 = chars1 - lastChars2 = chars2 - } - if lastDiff.Type == DiffDelete { - // The location was deleted. - return lastChars2 - } - // Add the remaining character length. - return lastChars2 + (loc - lastChars1) -} - -// DiffPrettyHtml converts a []Diff into a pretty HTML report. -// It is intended as an example from which to write one's own display functions. -func (dmp *DiffMatchPatch) DiffPrettyHtml(diffs []Diff) string { - var buff bytes.Buffer - for _, diff := range diffs { - text := strings.Replace(html.EscapeString(diff.Text), "\n", "¶
", -1) - switch diff.Type { - case DiffInsert: - _, _ = buff.WriteString("") - _, _ = buff.WriteString(text) - _, _ = buff.WriteString("") - case DiffDelete: - _, _ = buff.WriteString("") - _, _ = buff.WriteString(text) - _, _ = buff.WriteString("") - case DiffEqual: - _, _ = buff.WriteString("") - _, _ = buff.WriteString(text) - _, _ = buff.WriteString("") - } - } - return buff.String() -} - -// DiffPrettyText converts a []Diff into a colored text report. -func (dmp *DiffMatchPatch) DiffPrettyText(diffs []Diff) string { - var buff bytes.Buffer - for _, diff := range diffs { - text := diff.Text - - switch diff.Type { - case DiffInsert: - _, _ = buff.WriteString("\x1b[32m") - _, _ = buff.WriteString(text) - _, _ = buff.WriteString("\x1b[0m") - case DiffDelete: - _, _ = buff.WriteString("\x1b[31m") - _, _ = buff.WriteString(text) - _, _ = buff.WriteString("\x1b[0m") - case DiffEqual: - _, _ = buff.WriteString(text) - } - } - - return buff.String() -} - -// DiffText1 computes and returns the source text (all equalities and deletions). -func (dmp *DiffMatchPatch) DiffText1(diffs []Diff) string { - //StringBuilder text = new StringBuilder() - var text bytes.Buffer - - for _, aDiff := range diffs { - if aDiff.Type != DiffInsert { - _, _ = text.WriteString(aDiff.Text) - } - } - return text.String() -} - -// DiffText2 computes and returns the destination text (all equalities and insertions). -func (dmp *DiffMatchPatch) DiffText2(diffs []Diff) string { - var text bytes.Buffer - - for _, aDiff := range diffs { - if aDiff.Type != DiffDelete { - _, _ = text.WriteString(aDiff.Text) - } - } - return text.String() -} - -// DiffLevenshtein computes the Levenshtein distance that is the number of inserted, deleted or substituted characters. -func (dmp *DiffMatchPatch) DiffLevenshtein(diffs []Diff) int { - levenshtein := 0 - insertions := 0 - deletions := 0 - - for _, aDiff := range diffs { - switch aDiff.Type { - case DiffInsert: - insertions += utf8.RuneCountInString(aDiff.Text) - case DiffDelete: - deletions += utf8.RuneCountInString(aDiff.Text) - case DiffEqual: - // A deletion and an insertion is one substitution. - levenshtein += max(insertions, deletions) - insertions = 0 - deletions = 0 - } - } - - levenshtein += max(insertions, deletions) - return levenshtein -} - -// DiffToDelta crushes the diff into an encoded string which describes the operations required to transform text1 into text2. -// E.g. =3\t-2\t+ing -> Keep 3 chars, delete 2 chars, insert 'ing'. Operations are tab-separated. Inserted text is escaped using %xx notation. -func (dmp *DiffMatchPatch) DiffToDelta(diffs []Diff) string { - var text bytes.Buffer - for _, aDiff := range diffs { - switch aDiff.Type { - case DiffInsert: - _, _ = text.WriteString("+") - _, _ = text.WriteString(strings.Replace(url.QueryEscape(aDiff.Text), "+", " ", -1)) - _, _ = text.WriteString("\t") - break - case DiffDelete: - _, _ = text.WriteString("-") - _, _ = text.WriteString(strconv.Itoa(utf8.RuneCountInString(aDiff.Text))) - _, _ = text.WriteString("\t") - break - case DiffEqual: - _, _ = text.WriteString("=") - _, _ = text.WriteString(strconv.Itoa(utf8.RuneCountInString(aDiff.Text))) - _, _ = text.WriteString("\t") - break - } - } - delta := text.String() - if len(delta) != 0 { - // Strip off trailing tab character. - delta = delta[0 : utf8.RuneCountInString(delta)-1] - delta = unescaper.Replace(delta) - } - return delta -} - -// DiffFromDelta given the original text1, and an encoded string which describes the operations required to transform text1 into text2, comAdde the full diff. -func (dmp *DiffMatchPatch) DiffFromDelta(text1 string, delta string) (diffs []Diff, err error) { - i := 0 - runes := []rune(text1) - - for _, token := range strings.Split(delta, "\t") { - if len(token) == 0 { - // Blank tokens are ok (from a trailing \t). - continue - } - - // Each token begins with a one character parameter which specifies the operation of this token (delete, insert, equality). - param := token[1:] - - switch op := token[0]; op { - case '+': - // Decode would Diff all "+" to " " - param = strings.Replace(param, "+", "%2b", -1) - param, err = url.QueryUnescape(param) - if err != nil { - return nil, err - } - if !utf8.ValidString(param) { - return nil, fmt.Errorf("invalid UTF-8 token: %q", param) - } - - diffs = append(diffs, Diff{DiffInsert, param}) - case '=', '-': - n, err := strconv.ParseInt(param, 10, 0) - if err != nil { - return nil, err - } else if n < 0 { - return nil, errors.New("Negative number in DiffFromDelta: " + param) - } - - i += int(n) - // Break out if we are out of bounds, go1.6 can't handle this very well - if i > len(runes) { - break - } - // Remember that string slicing is by byte - we want by rune here. - text := string(runes[i-int(n) : i]) - - if op == '=' { - diffs = append(diffs, Diff{DiffEqual, text}) - } else { - diffs = append(diffs, Diff{DiffDelete, text}) - } - default: - // Anything else is an error. - return nil, errors.New("Invalid diff operation in DiffFromDelta: " + string(token[0])) - } - } - - if i != len(runes) { - return nil, fmt.Errorf("Delta length (%v) is different from source text length (%v)", i, len(text1)) - } - - return diffs, nil -} diff --git a/vendor/github.com/sergi/go-diff/diffmatchpatch/diffmatchpatch.go b/vendor/github.com/sergi/go-diff/diffmatchpatch/diffmatchpatch.go deleted file mode 100644 index d3acc32c..00000000 --- a/vendor/github.com/sergi/go-diff/diffmatchpatch/diffmatchpatch.go +++ /dev/null @@ -1,46 +0,0 @@ -// Copyright (c) 2012-2016 The go-diff authors. All rights reserved. -// https://github.com/sergi/go-diff -// See the included LICENSE file for license details. -// -// go-diff is a Go implementation of Google's Diff, Match, and Patch library -// Original library is Copyright (c) 2006 Google Inc. -// http://code.google.com/p/google-diff-match-patch/ - -// Package diffmatchpatch offers robust algorithms to perform the operations required for synchronizing plain text. -package diffmatchpatch - -import ( - "time" -) - -// DiffMatchPatch holds the configuration for diff-match-patch operations. -type DiffMatchPatch struct { - // Number of seconds to map a diff before giving up (0 for infinity). - DiffTimeout time.Duration - // Cost of an empty edit operation in terms of edit characters. - DiffEditCost int - // How far to search for a match (0 = exact location, 1000+ = broad match). A match this many characters away from the expected location will add 1.0 to the score (0.0 is a perfect match). - MatchDistance int - // When deleting a large block of text (over ~64 characters), how close do the contents have to be to match the expected contents. (0.0 = perfection, 1.0 = very loose). Note that MatchThreshold controls how closely the end points of a delete need to match. - PatchDeleteThreshold float64 - // Chunk size for context length. - PatchMargin int - // The number of bits in an int. - MatchMaxBits int - // At what point is no match declared (0.0 = perfection, 1.0 = very loose). - MatchThreshold float64 -} - -// New creates a new DiffMatchPatch object with default parameters. -func New() *DiffMatchPatch { - // Defaults. - return &DiffMatchPatch{ - DiffTimeout: time.Second, - DiffEditCost: 4, - MatchThreshold: 0.5, - MatchDistance: 1000, - PatchDeleteThreshold: 0.5, - PatchMargin: 4, - MatchMaxBits: 32, - } -} diff --git a/vendor/github.com/sergi/go-diff/diffmatchpatch/match.go b/vendor/github.com/sergi/go-diff/diffmatchpatch/match.go deleted file mode 100644 index 17374e10..00000000 --- a/vendor/github.com/sergi/go-diff/diffmatchpatch/match.go +++ /dev/null @@ -1,160 +0,0 @@ -// Copyright (c) 2012-2016 The go-diff authors. All rights reserved. -// https://github.com/sergi/go-diff -// See the included LICENSE file for license details. -// -// go-diff is a Go implementation of Google's Diff, Match, and Patch library -// Original library is Copyright (c) 2006 Google Inc. -// http://code.google.com/p/google-diff-match-patch/ - -package diffmatchpatch - -import ( - "math" -) - -// MatchMain locates the best instance of 'pattern' in 'text' near 'loc'. -// Returns -1 if no match found. -func (dmp *DiffMatchPatch) MatchMain(text, pattern string, loc int) int { - // Check for null inputs not needed since null can't be passed in C#. - - loc = int(math.Max(0, math.Min(float64(loc), float64(len(text))))) - if text == pattern { - // Shortcut (potentially not guaranteed by the algorithm) - return 0 - } else if len(text) == 0 { - // Nothing to match. - return -1 - } else if loc+len(pattern) <= len(text) && text[loc:loc+len(pattern)] == pattern { - // Perfect match at the perfect spot! (Includes case of null pattern) - return loc - } - // Do a fuzzy compare. - return dmp.MatchBitap(text, pattern, loc) -} - -// MatchBitap locates the best instance of 'pattern' in 'text' near 'loc' using the Bitap algorithm. -// Returns -1 if no match was found. -func (dmp *DiffMatchPatch) MatchBitap(text, pattern string, loc int) int { - // Initialise the alphabet. - s := dmp.MatchAlphabet(pattern) - - // Highest score beyond which we give up. - scoreThreshold := dmp.MatchThreshold - // Is there a nearby exact match? (speedup) - bestLoc := indexOf(text, pattern, loc) - if bestLoc != -1 { - scoreThreshold = math.Min(dmp.matchBitapScore(0, bestLoc, loc, - pattern), scoreThreshold) - // What about in the other direction? (speedup) - bestLoc = lastIndexOf(text, pattern, loc+len(pattern)) - if bestLoc != -1 { - scoreThreshold = math.Min(dmp.matchBitapScore(0, bestLoc, loc, - pattern), scoreThreshold) - } - } - - // Initialise the bit arrays. - matchmask := 1 << uint((len(pattern) - 1)) - bestLoc = -1 - - var binMin, binMid int - binMax := len(pattern) + len(text) - lastRd := []int{} - for d := 0; d < len(pattern); d++ { - // Scan for the best match; each iteration allows for one more error. Run a binary search to determine how far from 'loc' we can stray at this error level. - binMin = 0 - binMid = binMax - for binMin < binMid { - if dmp.matchBitapScore(d, loc+binMid, loc, pattern) <= scoreThreshold { - binMin = binMid - } else { - binMax = binMid - } - binMid = (binMax-binMin)/2 + binMin - } - // Use the result from this iteration as the maximum for the next. - binMax = binMid - start := int(math.Max(1, float64(loc-binMid+1))) - finish := int(math.Min(float64(loc+binMid), float64(len(text))) + float64(len(pattern))) - - rd := make([]int, finish+2) - rd[finish+1] = (1 << uint(d)) - 1 - - for j := finish; j >= start; j-- { - var charMatch int - if len(text) <= j-1 { - // Out of range. - charMatch = 0 - } else if _, ok := s[text[j-1]]; !ok { - charMatch = 0 - } else { - charMatch = s[text[j-1]] - } - - if d == 0 { - // First pass: exact match. - rd[j] = ((rd[j+1] << 1) | 1) & charMatch - } else { - // Subsequent passes: fuzzy match. - rd[j] = ((rd[j+1]<<1)|1)&charMatch | (((lastRd[j+1] | lastRd[j]) << 1) | 1) | lastRd[j+1] - } - if (rd[j] & matchmask) != 0 { - score := dmp.matchBitapScore(d, j-1, loc, pattern) - // This match will almost certainly be better than any existing match. But check anyway. - if score <= scoreThreshold { - // Told you so. - scoreThreshold = score - bestLoc = j - 1 - if bestLoc > loc { - // When passing loc, don't exceed our current distance from loc. - start = int(math.Max(1, float64(2*loc-bestLoc))) - } else { - // Already passed loc, downhill from here on in. - break - } - } - } - } - if dmp.matchBitapScore(d+1, loc, loc, pattern) > scoreThreshold { - // No hope for a (better) match at greater error levels. - break - } - lastRd = rd - } - return bestLoc -} - -// matchBitapScore computes and returns the score for a match with e errors and x location. -func (dmp *DiffMatchPatch) matchBitapScore(e, x, loc int, pattern string) float64 { - accuracy := float64(e) / float64(len(pattern)) - proximity := math.Abs(float64(loc - x)) - if dmp.MatchDistance == 0 { - // Dodge divide by zero error. - if proximity == 0 { - return accuracy - } - - return 1.0 - } - return accuracy + (proximity / float64(dmp.MatchDistance)) -} - -// MatchAlphabet initialises the alphabet for the Bitap algorithm. -func (dmp *DiffMatchPatch) MatchAlphabet(pattern string) map[byte]int { - s := map[byte]int{} - charPattern := []byte(pattern) - for _, c := range charPattern { - _, ok := s[c] - if !ok { - s[c] = 0 - } - } - i := 0 - - for _, c := range charPattern { - value := s[c] | int(uint(1)< y { - return x - } - return y -} diff --git a/vendor/github.com/sergi/go-diff/diffmatchpatch/operation_string.go b/vendor/github.com/sergi/go-diff/diffmatchpatch/operation_string.go deleted file mode 100644 index 533ec0da..00000000 --- a/vendor/github.com/sergi/go-diff/diffmatchpatch/operation_string.go +++ /dev/null @@ -1,17 +0,0 @@ -// 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/sergi/go-diff/diffmatchpatch/patch.go b/vendor/github.com/sergi/go-diff/diffmatchpatch/patch.go deleted file mode 100644 index 223c43c4..00000000 --- a/vendor/github.com/sergi/go-diff/diffmatchpatch/patch.go +++ /dev/null @@ -1,556 +0,0 @@ -// Copyright (c) 2012-2016 The go-diff authors. All rights reserved. -// https://github.com/sergi/go-diff -// See the included LICENSE file for license details. -// -// go-diff is a Go implementation of Google's Diff, Match, and Patch library -// Original library is Copyright (c) 2006 Google Inc. -// http://code.google.com/p/google-diff-match-patch/ - -package diffmatchpatch - -import ( - "bytes" - "errors" - "math" - "net/url" - "regexp" - "strconv" - "strings" -) - -// Patch represents one patch operation. -type Patch struct { - diffs []Diff - Start1 int - Start2 int - Length1 int - Length2 int -} - -// String emulates GNU diff's format. -// Header: @@ -382,8 +481,9 @@ -// Indices are printed as 1-based, not 0-based. -func (p *Patch) String() string { - var coords1, coords2 string - - if p.Length1 == 0 { - coords1 = strconv.Itoa(p.Start1) + ",0" - } else if p.Length1 == 1 { - coords1 = strconv.Itoa(p.Start1 + 1) - } else { - coords1 = strconv.Itoa(p.Start1+1) + "," + strconv.Itoa(p.Length1) - } - - if p.Length2 == 0 { - coords2 = strconv.Itoa(p.Start2) + ",0" - } else if p.Length2 == 1 { - coords2 = strconv.Itoa(p.Start2 + 1) - } else { - coords2 = strconv.Itoa(p.Start2+1) + "," + strconv.Itoa(p.Length2) - } - - var text bytes.Buffer - _, _ = text.WriteString("@@ -" + coords1 + " +" + coords2 + " @@\n") - - // Escape the body of the patch with %xx notation. - for _, aDiff := range p.diffs { - switch aDiff.Type { - case DiffInsert: - _, _ = text.WriteString("+") - case DiffDelete: - _, _ = text.WriteString("-") - case DiffEqual: - _, _ = text.WriteString(" ") - } - - _, _ = text.WriteString(strings.Replace(url.QueryEscape(aDiff.Text), "+", " ", -1)) - _, _ = text.WriteString("\n") - } - - return unescaper.Replace(text.String()) -} - -// PatchAddContext increases the context until it is unique, but doesn't let the pattern expand beyond MatchMaxBits. -func (dmp *DiffMatchPatch) PatchAddContext(patch Patch, text string) Patch { - if len(text) == 0 { - return patch - } - - pattern := text[patch.Start2 : patch.Start2+patch.Length1] - padding := 0 - - // Look for the first and last matches of pattern in text. If two different matches are found, increase the pattern length. - for strings.Index(text, pattern) != strings.LastIndex(text, pattern) && - len(pattern) < dmp.MatchMaxBits-2*dmp.PatchMargin { - padding += dmp.PatchMargin - maxStart := max(0, patch.Start2-padding) - minEnd := min(len(text), patch.Start2+patch.Length1+padding) - pattern = text[maxStart:minEnd] - } - // Add one chunk for good luck. - padding += dmp.PatchMargin - - // Add the prefix. - prefix := text[max(0, patch.Start2-padding):patch.Start2] - if len(prefix) != 0 { - patch.diffs = append([]Diff{Diff{DiffEqual, prefix}}, patch.diffs...) - } - // Add the suffix. - suffix := text[patch.Start2+patch.Length1 : min(len(text), patch.Start2+patch.Length1+padding)] - if len(suffix) != 0 { - patch.diffs = append(patch.diffs, Diff{DiffEqual, suffix}) - } - - // Roll back the start points. - patch.Start1 -= len(prefix) - patch.Start2 -= len(prefix) - // Extend the lengths. - patch.Length1 += len(prefix) + len(suffix) - patch.Length2 += len(prefix) + len(suffix) - - return patch -} - -// PatchMake computes a list of patches. -func (dmp *DiffMatchPatch) PatchMake(opt ...interface{}) []Patch { - if len(opt) == 1 { - diffs, _ := opt[0].([]Diff) - text1 := dmp.DiffText1(diffs) - return dmp.PatchMake(text1, diffs) - } else if len(opt) == 2 { - text1 := opt[0].(string) - switch t := opt[1].(type) { - case string: - diffs := dmp.DiffMain(text1, t, true) - if len(diffs) > 2 { - diffs = dmp.DiffCleanupSemantic(diffs) - diffs = dmp.DiffCleanupEfficiency(diffs) - } - return dmp.PatchMake(text1, diffs) - case []Diff: - return dmp.patchMake2(text1, t) - } - } else if len(opt) == 3 { - return dmp.PatchMake(opt[0], opt[2]) - } - return []Patch{} -} - -// patchMake2 computes a list of patches to turn text1 into text2. -// text2 is not provided, diffs are the delta between text1 and text2. -func (dmp *DiffMatchPatch) patchMake2(text1 string, diffs []Diff) []Patch { - // Check for null inputs not needed since null can't be passed in C#. - patches := []Patch{} - if len(diffs) == 0 { - return patches // Get rid of the null case. - } - - patch := Patch{} - charCount1 := 0 // Number of characters into the text1 string. - charCount2 := 0 // Number of characters into the text2 string. - // Start with text1 (prepatchText) and apply the diffs until we arrive at text2 (postpatchText). We recreate the patches one by one to determine context info. - prepatchText := text1 - postpatchText := text1 - - for i, aDiff := range diffs { - if len(patch.diffs) == 0 && aDiff.Type != DiffEqual { - // A new patch starts here. - patch.Start1 = charCount1 - patch.Start2 = charCount2 - } - - switch aDiff.Type { - case DiffInsert: - patch.diffs = append(patch.diffs, aDiff) - patch.Length2 += len(aDiff.Text) - postpatchText = postpatchText[:charCount2] + - aDiff.Text + postpatchText[charCount2:] - case DiffDelete: - patch.Length1 += len(aDiff.Text) - patch.diffs = append(patch.diffs, aDiff) - postpatchText = postpatchText[:charCount2] + postpatchText[charCount2+len(aDiff.Text):] - case DiffEqual: - if len(aDiff.Text) <= 2*dmp.PatchMargin && - len(patch.diffs) != 0 && i != len(diffs)-1 { - // Small equality inside a patch. - patch.diffs = append(patch.diffs, aDiff) - patch.Length1 += len(aDiff.Text) - patch.Length2 += len(aDiff.Text) - } - if len(aDiff.Text) >= 2*dmp.PatchMargin { - // Time for a new patch. - if len(patch.diffs) != 0 { - patch = dmp.PatchAddContext(patch, prepatchText) - patches = append(patches, patch) - patch = Patch{} - // Unlike Unidiff, our patch lists have a rolling context. http://code.google.com/p/google-diff-match-patch/wiki/Unidiff Update prepatch text & pos to reflect the application of the just completed patch. - prepatchText = postpatchText - charCount1 = charCount2 - } - } - } - - // Update the current character count. - if aDiff.Type != DiffInsert { - charCount1 += len(aDiff.Text) - } - if aDiff.Type != DiffDelete { - charCount2 += len(aDiff.Text) - } - } - - // Pick up the leftover patch if not empty. - if len(patch.diffs) != 0 { - patch = dmp.PatchAddContext(patch, prepatchText) - patches = append(patches, patch) - } - - return patches -} - -// PatchDeepCopy returns an array that is identical to a given an array of patches. -func (dmp *DiffMatchPatch) PatchDeepCopy(patches []Patch) []Patch { - patchesCopy := []Patch{} - for _, aPatch := range patches { - patchCopy := Patch{} - for _, aDiff := range aPatch.diffs { - patchCopy.diffs = append(patchCopy.diffs, Diff{ - aDiff.Type, - aDiff.Text, - }) - } - patchCopy.Start1 = aPatch.Start1 - patchCopy.Start2 = aPatch.Start2 - patchCopy.Length1 = aPatch.Length1 - patchCopy.Length2 = aPatch.Length2 - patchesCopy = append(patchesCopy, patchCopy) - } - return patchesCopy -} - -// PatchApply merges a set of patches onto the text. Returns a patched text, as well as an array of true/false values indicating which patches were applied. -func (dmp *DiffMatchPatch) PatchApply(patches []Patch, text string) (string, []bool) { - if len(patches) == 0 { - return text, []bool{} - } - - // Deep copy the patches so that no changes are made to originals. - patches = dmp.PatchDeepCopy(patches) - - nullPadding := dmp.PatchAddPadding(patches) - text = nullPadding + text + nullPadding - patches = dmp.PatchSplitMax(patches) - - x := 0 - // delta keeps track of the offset between the expected and actual location of the previous patch. If there are patches expected at positions 10 and 20, but the first patch was found at 12, delta is 2 and the second patch has an effective expected position of 22. - delta := 0 - results := make([]bool, len(patches)) - for _, aPatch := range patches { - expectedLoc := aPatch.Start2 + delta - text1 := dmp.DiffText1(aPatch.diffs) - var startLoc int - endLoc := -1 - if len(text1) > dmp.MatchMaxBits { - // PatchSplitMax will only provide an oversized pattern in the case of a monster delete. - startLoc = dmp.MatchMain(text, text1[:dmp.MatchMaxBits], expectedLoc) - if startLoc != -1 { - endLoc = dmp.MatchMain(text, - text1[len(text1)-dmp.MatchMaxBits:], expectedLoc+len(text1)-dmp.MatchMaxBits) - if endLoc == -1 || startLoc >= endLoc { - // Can't find valid trailing context. Drop this patch. - startLoc = -1 - } - } - } else { - startLoc = dmp.MatchMain(text, text1, expectedLoc) - } - if startLoc == -1 { - // No match found. :( - results[x] = false - // Subtract the delta for this failed patch from subsequent patches. - delta -= aPatch.Length2 - aPatch.Length1 - } else { - // Found a match. :) - results[x] = true - delta = startLoc - expectedLoc - var text2 string - if endLoc == -1 { - text2 = text[startLoc:int(math.Min(float64(startLoc+len(text1)), float64(len(text))))] - } else { - text2 = text[startLoc:int(math.Min(float64(endLoc+dmp.MatchMaxBits), float64(len(text))))] - } - if text1 == text2 { - // Perfect match, just shove the Replacement text in. - text = text[:startLoc] + dmp.DiffText2(aPatch.diffs) + text[startLoc+len(text1):] - } else { - // Imperfect match. Run a diff to get a framework of equivalent indices. - diffs := dmp.DiffMain(text1, text2, false) - if len(text1) > dmp.MatchMaxBits && float64(dmp.DiffLevenshtein(diffs))/float64(len(text1)) > dmp.PatchDeleteThreshold { - // The end points match, but the content is unacceptably bad. - results[x] = false - } else { - diffs = dmp.DiffCleanupSemanticLossless(diffs) - index1 := 0 - for _, aDiff := range aPatch.diffs { - if aDiff.Type != DiffEqual { - index2 := dmp.DiffXIndex(diffs, index1) - if aDiff.Type == DiffInsert { - // Insertion - text = text[:startLoc+index2] + aDiff.Text + text[startLoc+index2:] - } else if aDiff.Type == DiffDelete { - // Deletion - startIndex := startLoc + index2 - text = text[:startIndex] + - text[startIndex+dmp.DiffXIndex(diffs, index1+len(aDiff.Text))-index2:] - } - } - if aDiff.Type != DiffDelete { - index1 += len(aDiff.Text) - } - } - } - } - } - x++ - } - // Strip the padding off. - text = text[len(nullPadding) : len(nullPadding)+(len(text)-2*len(nullPadding))] - return text, results -} - -// PatchAddPadding adds some padding on text start and end so that edges can match something. -// Intended to be called only from within patchApply. -func (dmp *DiffMatchPatch) PatchAddPadding(patches []Patch) string { - paddingLength := dmp.PatchMargin - nullPadding := "" - for x := 1; x <= paddingLength; x++ { - nullPadding += string(x) - } - - // Bump all the patches forward. - for i := range patches { - patches[i].Start1 += paddingLength - patches[i].Start2 += paddingLength - } - - // Add some padding on start of first diff. - if len(patches[0].diffs) == 0 || patches[0].diffs[0].Type != DiffEqual { - // Add nullPadding equality. - patches[0].diffs = append([]Diff{Diff{DiffEqual, nullPadding}}, patches[0].diffs...) - patches[0].Start1 -= paddingLength // Should be 0. - patches[0].Start2 -= paddingLength // Should be 0. - patches[0].Length1 += paddingLength - patches[0].Length2 += paddingLength - } else if paddingLength > len(patches[0].diffs[0].Text) { - // Grow first equality. - extraLength := paddingLength - len(patches[0].diffs[0].Text) - patches[0].diffs[0].Text = nullPadding[len(patches[0].diffs[0].Text):] + patches[0].diffs[0].Text - patches[0].Start1 -= extraLength - patches[0].Start2 -= extraLength - patches[0].Length1 += extraLength - patches[0].Length2 += extraLength - } - - // Add some padding on end of last diff. - last := len(patches) - 1 - if len(patches[last].diffs) == 0 || patches[last].diffs[len(patches[last].diffs)-1].Type != DiffEqual { - // Add nullPadding equality. - patches[last].diffs = append(patches[last].diffs, Diff{DiffEqual, nullPadding}) - patches[last].Length1 += paddingLength - patches[last].Length2 += paddingLength - } else if paddingLength > len(patches[last].diffs[len(patches[last].diffs)-1].Text) { - // Grow last equality. - lastDiff := patches[last].diffs[len(patches[last].diffs)-1] - extraLength := paddingLength - len(lastDiff.Text) - patches[last].diffs[len(patches[last].diffs)-1].Text += nullPadding[:extraLength] - patches[last].Length1 += extraLength - patches[last].Length2 += extraLength - } - - return nullPadding -} - -// PatchSplitMax looks through the patches and breaks up any which are longer than the maximum limit of the match algorithm. -// Intended to be called only from within patchApply. -func (dmp *DiffMatchPatch) PatchSplitMax(patches []Patch) []Patch { - patchSize := dmp.MatchMaxBits - for x := 0; x < len(patches); x++ { - if patches[x].Length1 <= patchSize { - continue - } - bigpatch := patches[x] - // Remove the big old patch. - patches = append(patches[:x], patches[x+1:]...) - x-- - - Start1 := bigpatch.Start1 - Start2 := bigpatch.Start2 - precontext := "" - for len(bigpatch.diffs) != 0 { - // Create one of several smaller patches. - patch := Patch{} - empty := true - patch.Start1 = Start1 - len(precontext) - patch.Start2 = Start2 - len(precontext) - if len(precontext) != 0 { - patch.Length1 = len(precontext) - patch.Length2 = len(precontext) - patch.diffs = append(patch.diffs, Diff{DiffEqual, precontext}) - } - for len(bigpatch.diffs) != 0 && patch.Length1 < patchSize-dmp.PatchMargin { - diffType := bigpatch.diffs[0].Type - diffText := bigpatch.diffs[0].Text - if diffType == DiffInsert { - // Insertions are harmless. - patch.Length2 += len(diffText) - Start2 += len(diffText) - patch.diffs = append(patch.diffs, bigpatch.diffs[0]) - bigpatch.diffs = bigpatch.diffs[1:] - empty = false - } else if diffType == DiffDelete && len(patch.diffs) == 1 && patch.diffs[0].Type == DiffEqual && len(diffText) > 2*patchSize { - // This is a large deletion. Let it pass in one chunk. - patch.Length1 += len(diffText) - Start1 += len(diffText) - empty = false - patch.diffs = append(patch.diffs, Diff{diffType, diffText}) - bigpatch.diffs = bigpatch.diffs[1:] - } else { - // Deletion or equality. Only take as much as we can stomach. - diffText = diffText[:min(len(diffText), patchSize-patch.Length1-dmp.PatchMargin)] - - patch.Length1 += len(diffText) - Start1 += len(diffText) - if diffType == DiffEqual { - patch.Length2 += len(diffText) - Start2 += len(diffText) - } else { - empty = false - } - patch.diffs = append(patch.diffs, Diff{diffType, diffText}) - if diffText == bigpatch.diffs[0].Text { - bigpatch.diffs = bigpatch.diffs[1:] - } else { - bigpatch.diffs[0].Text = - bigpatch.diffs[0].Text[len(diffText):] - } - } - } - // Compute the head context for the next patch. - precontext = dmp.DiffText2(patch.diffs) - precontext = precontext[max(0, len(precontext)-dmp.PatchMargin):] - - postcontext := "" - // Append the end context for this patch. - if len(dmp.DiffText1(bigpatch.diffs)) > dmp.PatchMargin { - postcontext = dmp.DiffText1(bigpatch.diffs)[:dmp.PatchMargin] - } else { - postcontext = dmp.DiffText1(bigpatch.diffs) - } - - if len(postcontext) != 0 { - patch.Length1 += len(postcontext) - patch.Length2 += len(postcontext) - if len(patch.diffs) != 0 && patch.diffs[len(patch.diffs)-1].Type == DiffEqual { - patch.diffs[len(patch.diffs)-1].Text += postcontext - } else { - patch.diffs = append(patch.diffs, Diff{DiffEqual, postcontext}) - } - } - if !empty { - x++ - patches = append(patches[:x], append([]Patch{patch}, patches[x:]...)...) - } - } - } - return patches -} - -// PatchToText takes a list of patches and returns a textual representation. -func (dmp *DiffMatchPatch) PatchToText(patches []Patch) string { - var text bytes.Buffer - for _, aPatch := range patches { - _, _ = text.WriteString(aPatch.String()) - } - return text.String() -} - -// PatchFromText parses a textual representation of patches and returns a List of Patch objects. -func (dmp *DiffMatchPatch) PatchFromText(textline string) ([]Patch, error) { - patches := []Patch{} - if len(textline) == 0 { - return patches, nil - } - text := strings.Split(textline, "\n") - textPointer := 0 - patchHeader := regexp.MustCompile("^@@ -(\\d+),?(\\d*) \\+(\\d+),?(\\d*) @@$") - - var patch Patch - var sign uint8 - var line string - for textPointer < len(text) { - - if !patchHeader.MatchString(text[textPointer]) { - return patches, errors.New("Invalid patch string: " + text[textPointer]) - } - - patch = Patch{} - m := patchHeader.FindStringSubmatch(text[textPointer]) - - patch.Start1, _ = strconv.Atoi(m[1]) - if len(m[2]) == 0 { - patch.Start1-- - patch.Length1 = 1 - } else if m[2] == "0" { - patch.Length1 = 0 - } else { - patch.Start1-- - patch.Length1, _ = strconv.Atoi(m[2]) - } - - patch.Start2, _ = strconv.Atoi(m[3]) - - if len(m[4]) == 0 { - patch.Start2-- - patch.Length2 = 1 - } else if m[4] == "0" { - patch.Length2 = 0 - } else { - patch.Start2-- - patch.Length2, _ = strconv.Atoi(m[4]) - } - textPointer++ - - for textPointer < len(text) { - if len(text[textPointer]) > 0 { - sign = text[textPointer][0] - } else { - textPointer++ - continue - } - - line = text[textPointer][1:] - line = strings.Replace(line, "+", "%2b", -1) - line, _ = url.QueryUnescape(line) - if sign == '-' { - // Deletion. - patch.diffs = append(patch.diffs, Diff{DiffDelete, line}) - } else if sign == '+' { - // Insertion. - patch.diffs = append(patch.diffs, Diff{DiffInsert, line}) - } else if sign == ' ' { - // Minor equality. - patch.diffs = append(patch.diffs, Diff{DiffEqual, line}) - } else if sign == '@' { - // Start of next patch. - break - } else { - // WTF? - return patches, errors.New("Invalid patch mode '" + string(sign) + "' in: " + string(line)) - } - textPointer++ - } - - patches = append(patches, patch) - } - return patches, nil -} diff --git a/vendor/github.com/sergi/go-diff/diffmatchpatch/stringutil.go b/vendor/github.com/sergi/go-diff/diffmatchpatch/stringutil.go deleted file mode 100644 index 265f29cc..00000000 --- a/vendor/github.com/sergi/go-diff/diffmatchpatch/stringutil.go +++ /dev/null @@ -1,88 +0,0 @@ -// Copyright (c) 2012-2016 The go-diff authors. All rights reserved. -// https://github.com/sergi/go-diff -// See the included LICENSE file for license details. -// -// go-diff is a Go implementation of Google's Diff, Match, and Patch library -// Original library is Copyright (c) 2006 Google Inc. -// http://code.google.com/p/google-diff-match-patch/ - -package diffmatchpatch - -import ( - "strings" - "unicode/utf8" -) - -// unescaper unescapes selected chars for compatibility with JavaScript's encodeURI. -// In speed critical applications this could be dropped since the receiving application will certainly decode these fine. Note that this function is case-sensitive. Thus "%3F" would not be unescaped. But this is ok because it is only called with the output of HttpUtility.UrlEncode which returns lowercase hex. Example: "%3f" -> "?", "%24" -> "$", etc. -var unescaper = strings.NewReplacer( - "%21", "!", "%7E", "~", "%27", "'", - "%28", "(", "%29", ")", "%3B", ";", - "%2F", "/", "%3F", "?", "%3A", ":", - "%40", "@", "%26", "&", "%3D", "=", - "%2B", "+", "%24", "$", "%2C", ",", "%23", "#", "%2A", "*") - -// indexOf returns the first index of pattern in str, starting at str[i]. -func indexOf(str string, pattern string, i int) int { - if i > len(str)-1 { - return -1 - } - if i <= 0 { - return strings.Index(str, pattern) - } - ind := strings.Index(str[i:], pattern) - if ind == -1 { - return -1 - } - return ind + i -} - -// lastIndexOf returns the last index of pattern in str, starting at str[i]. -func lastIndexOf(str string, pattern string, i int) int { - if i < 0 { - return -1 - } - if i >= len(str) { - return strings.LastIndex(str, pattern) - } - _, size := utf8.DecodeRuneInString(str[i:]) - return strings.LastIndex(str[:i+size], pattern) -} - -// runesIndexOf returns the index of pattern in target, starting at target[i]. -func runesIndexOf(target, pattern []rune, i int) int { - if i > len(target)-1 { - return -1 - } - if i <= 0 { - return runesIndex(target, pattern) - } - ind := runesIndex(target[i:], pattern) - if ind == -1 { - return -1 - } - return ind + i -} - -func runesEqual(r1, r2 []rune) bool { - if len(r1) != len(r2) { - return false - } - for i, c := range r1 { - if c != r2[i] { - return false - } - } - return true -} - -// runesIndex is the equivalent of strings.Index for rune slices. -func runesIndex(r1, r2 []rune) int { - last := len(r1) - len(r2) - for i := 0; i <= last; i++ { - if runesEqual(r1[i:i+len(r2)], r2) { - return i - } - } - return -1 -} diff --git a/vendor/github.com/tsenart/go-tsz/.gitignore b/vendor/github.com/tsenart/go-tsz/.gitignore deleted file mode 100644 index 28bb1653..00000000 --- a/vendor/github.com/tsenart/go-tsz/.gitignore +++ /dev/null @@ -1,3 +0,0 @@ -eval/eval -/target -*.test diff --git a/vendor/github.com/tsenart/go-tsz/.travis.yml b/vendor/github.com/tsenart/go-tsz/.travis.yml deleted file mode 100644 index 10c8a832..00000000 --- a/vendor/github.com/tsenart/go-tsz/.travis.yml +++ /dev/null @@ -1,38 +0,0 @@ -language: go - -sudo: false - -branches: - except: - - release - -branches: - only: - - master - - develop - - travis - -go: - - 1.9 - - tip - -matrix: - allow_failures: - - go: tip - -before_install: - - if [ -n "$GH_USER" ]; then git config --global github.user ${GH_USER}; fi; - - if [ -n "$GH_TOKEN" ]; then git config --global github.token ${GH_TOKEN}; fi; - - go get github.com/mattn/goveralls - -before_script: - - make deps - -script: - - make qa - -after_failure: - - cat ./target/test/report.xml - -after_success: - - if [ "$TRAVIS_GO_VERSION" = "1.9" ]; then $HOME/gopath/bin/goveralls -covermode=count -coverprofile=target/report/coverage.out -service=travis-ci; fi; diff --git a/vendor/github.com/tsenart/go-tsz/LICENSE b/vendor/github.com/tsenart/go-tsz/LICENSE deleted file mode 100644 index d6a0dcea..00000000 --- a/vendor/github.com/tsenart/go-tsz/LICENSE +++ /dev/null @@ -1,230 +0,0 @@ -Copyright (c) 2015, 2016 Damian Gryski -Copyright (c) 2018 Tomás Senart - -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. - -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 HOLDER 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. - - -------------------------------------------------------------------------------- - - 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/tsenart/go-tsz/Makefile b/vendor/github.com/tsenart/go-tsz/Makefile deleted file mode 100644 index 8298cd85..00000000 --- a/vendor/github.com/tsenart/go-tsz/Makefile +++ /dev/null @@ -1,203 +0,0 @@ -# MAKEFILE -# -# @author Nicola Asuni -# @link https://github.com/tsenart/go-tsz -# -# This file is intended to be executed in a Linux-compatible system. -# It also assumes that the project has been cloned in the right path under GOPATH: -# $GOPATH/src/github.com/tsenart/go-tsz -# -# ------------------------------------------------------------------------------ - -# List special make targets that are not associated with files -.PHONY: help all test format fmtcheck vet lint coverage cyclo ineffassign misspell structcheck varcheck errcheck gosimple astscan qa deps clean nuke - -# Use bash as shell (Note: Ubuntu now uses dash which doesn't support PIPESTATUS). -SHELL=/bin/bash - -# CVS path (path to the parent dir containing the project) -CVSPATH=github.com/tsenart - -# Project owner -OWNER=tsenart - -# Project vendor -VENDOR=tsenart - -# Project name -PROJECT=go-tsz - -# Project version -VERSION=$(shell cat VERSION) - -# Name of RPM or DEB package -PKGNAME=${VENDOR}-${PROJECT} - -# Current directory -CURRENTDIR=$(shell pwd) - -# GO lang path -ifneq ($(GOPATH),) - ifeq ($(findstring $(GOPATH),$(CURRENTDIR)),) - # the defined GOPATH is not valid - GOPATH= - endif -endif -ifeq ($(GOPATH),) - # extract the GOPATH - GOPATH=$(firstword $(subst /src/, ,$(CURRENTDIR))) -endif - -# --- MAKE TARGETS --- - -# Display general help about this command -help: - @echo "" - @echo "$(PROJECT) Makefile." - @echo "GOPATH=$(GOPATH)" - @echo "The following commands are available:" - @echo "" - @echo " make qa : Run all the tests" - @echo " make test : Run the unit tests" - @echo "" - @echo " make format : Format the source code" - @echo " make fmtcheck : Check if the source code has been formatted" - @echo " make vet : Check for suspicious constructs" - @echo " make lint : Check for style errors" - @echo " make coverage : Generate the coverage report" - @echo " make cyclo : Generate the cyclomatic complexity report" - @echo " make ineffassign : Detect ineffectual assignments" - @echo " make misspell : Detect commonly misspelled words in source files" - @echo " make structcheck : Find unused struct fields" - @echo " make varcheck : Find unused global variables and constants" - @echo " make errcheck : Check that error return values are used" - @echo " make gosimple : Suggest code simplifications" - @echo " make astscan : GO AST scanner" - @echo "" - @echo " make docs : Generate source code documentation" - @echo "" - @echo " make deps : Get the dependencies" - @echo " make clean : Remove any build artifact" - @echo " make nuke : Deletes any intermediate file" - @echo "" - - -# Alias for help target -all: help - -# Run the unit tests -test: - @mkdir -p target/test - @mkdir -p target/report - GOPATH=$(GOPATH) \ - go test \ - -covermode=atomic \ - -bench=. \ - -race \ - -cpuprofile=target/report/cpu.out \ - -memprofile=target/report/mem.out \ - -mutexprofile=target/report/mutex.out \ - -coverprofile=target/report/coverage.out \ - -v . | \ - tee >(PATH=$(GOPATH)/bin:$(PATH) go-junit-report > target/test/report.xml); \ - test $${PIPESTATUS[0]} -eq 0 - -# Format the source code -format: - @find . -type f -name "*.go" -exec gofmt -s -w {} \; - -# Check if the source code has been formatted -fmtcheck: - @mkdir -p target - @find . -type f -name "*.go" -exec gofmt -s -d {} \; | tee target/format.diff - @test ! -s target/format.diff || { echo "ERROR: the source code has not been formatted - please use 'make format' or 'gofmt'"; exit 1; } - -# Check for syntax errors -vet: - GOPATH=$(GOPATH) go vet . - -# Check for style errors -lint: - GOPATH=$(GOPATH) PATH=$(GOPATH)/bin:$(PATH) golint . - -# Generate the coverage report -coverage: - @mkdir -p target/report - GOPATH=$(GOPATH) \ - go tool cover -html=target/report/coverage.out -o target/report/coverage.html - -# Report cyclomatic complexity -cyclo: - @mkdir -p target/report - GOPATH=$(GOPATH) gocyclo -avg ./ | tee target/report/cyclo.txt ; test $${PIPESTATUS[0]} -eq 0 - -# Detect ineffectual assignments -ineffassign: - @mkdir -p target/report - GOPATH=$(GOPATH) ineffassign ./ | tee target/report/ineffassign.txt ; test $${PIPESTATUS[0]} -eq 0 - -# Detect commonly misspelled words in source files -misspell: - @mkdir -p target/report - GOPATH=$(GOPATH) misspell -error ./ | tee target/report/misspell.txt ; test $${PIPESTATUS[0]} -eq 0 - -# Find unused struct fields -structcheck: - @mkdir -p target/report - GOPATH=$(GOPATH) structcheck -a ./ | tee target/report/structcheck.txt - -# Find unused global variables and constants -varcheck: - @mkdir -p target/report - GOPATH=$(GOPATH) varcheck -e ./ | tee target/report/varcheck.txt - -# Check that error return values are used -errcheck: - @mkdir -p target/report - GOPATH=$(GOPATH) errcheck ./ | tee target/report/errcheck.txt - -# Suggest code simplifications -gosimple: - @mkdir -p target/report - GOPATH=$(GOPATH) gosimple ./ | tee target/report/gosimple.txt - -# AST scanner -astscan: - @mkdir -p target/report - GOPATH=$(GOPATH) gas .//*.go | tee target/report/astscan.txt - -# Generate source docs -docs: - @mkdir -p target/docs - nohup sh -c 'GOPATH=$(GOPATH) godoc -http=127.0.0.1:6060' > target/godoc_server.log 2>&1 & - wget --directory-prefix=target/docs/ --execute robots=off --retry-connrefused --recursive --no-parent --adjust-extension --page-requisites --convert-links http://127.0.0.1:6060/pkg/github.com/${VENDOR}/${PROJECT}/ ; kill -9 `lsof -ti :6060` - @echo ''${PKGNAME}' Documentation ...' > target/docs/index.html - -# Alias to run all quality-assurance checks -qa: fmtcheck test vet lint coverage cyclo ineffassign misspell structcheck varcheck errcheck gosimple astscan - -# --- INSTALL --- - -# Get the dependencies -deps: - GOPATH=$(GOPATH) go get ./... - GOPATH=$(GOPATH) go get github.com/golang/lint/golint - GOPATH=$(GOPATH) go get github.com/jstemmer/go-junit-report - GOPATH=$(GOPATH) go get github.com/axw/gocov/gocov - GOPATH=$(GOPATH) go get github.com/fzipp/gocyclo - GOPATH=$(GOPATH) go get github.com/gordonklaus/ineffassign - GOPATH=$(GOPATH) go get github.com/client9/misspell/cmd/misspell - GOPATH=$(GOPATH) go get github.com/opennota/check/cmd/structcheck - GOPATH=$(GOPATH) go get github.com/opennota/check/cmd/varcheck - GOPATH=$(GOPATH) go get github.com/kisielk/errcheck - GOPATH=$(GOPATH) go get honnef.co/go/tools/cmd/gosimple - GOPATH=$(GOPATH) go get github.com/GoASTScanner/gas - -# Remove any build artifact -clean: - GOPATH=$(GOPATH) go clean ./... - -# Deletes any intermediate file -nuke: - rm -rf ./target - GOPATH=$(GOPATH) go clean -i ./... diff --git a/vendor/github.com/tsenart/go-tsz/README.md b/vendor/github.com/tsenart/go-tsz/README.md deleted file mode 100644 index 758dc247..00000000 --- a/vendor/github.com/tsenart/go-tsz/README.md +++ /dev/null @@ -1,41 +0,0 @@ -# go-tsz - -* Package tsz implement time-series compression http://www.vldb.org/pvldb/vol8/p1816-teller.pdf in Go* - -[![Master Branch](https://img.shields.io/badge/branch-master-lightgray.svg)](https://github.com/tsenart/go-tsz/tree/master) -[![Master Build Status](https://secure.travis-ci.org/tsenart/go-tsz.svg?branch=master)](https://travis-ci.org/tsenart/go-tsz?branch=master) -[![Master Coverage Status](https://coveralls.io/repos/tsenart/go-tsz/badge.svg?branch=master&service=github)](https://coveralls.io/github/tsenart/go-tsz?branch=master) -[![Go Report Card](https://goreportcard.com/badge/github.com/tsenart/go-tsz)](https://goreportcard.com/report/github.com/tsenart/go-tsz) -[![GoDoc](https://godoc.org/github.com/tsenart/go-tsz?status.svg)](http://godoc.org/github.com/tsenart/go-tsz) - -## Description - -Package tsz is a fork of [github.com/dgryski/go-tsz](https://github.com/dgryski/go-tsz) that implements -improvements over the [original Gorilla paper](http://www.vldb.org/pvldb/vol8/p1816-teller.pdf) developed by @burmann -in his [Master Thesis](https://aaltodoc.aalto.fi/bitstream/handle/123456789/29099/master_Burman_Michael_2017.pdf?sequence=1) -and released in https://github.com/burmanm/gorilla-tsc. - - -### Differences from the original paper -- Maximum number of leading zeros is stored with 6 bits to allow up to 63 leading zeros, which are necessary when storing long values. - -- Timestamp delta-of-delta is stored by first turning it to a positive integer with ZigZag encoding and then reduced by one to fit in the necessary bits. In the decoding phase all the values are incremented by one to fetch the original value. - -- The compressed blocks are created with a 27 bit delta header (unlike in the original paper, which uses a 14 bit delta header). This allows to use up to one day block size using millisecond precision. - -## Getting started - -This library is written in Go language, please refer to the guides in https://golang.org for getting started. - -This project include a Makefile that allows you to test and build the project with simple commands. -To see all available options: -```bash -make help -``` - -## Running all tests - -Before committing the code, please check if it passes all tests using -```bash -make qa -``` diff --git a/vendor/github.com/tsenart/go-tsz/VERSION b/vendor/github.com/tsenart/go-tsz/VERSION deleted file mode 100644 index 3eefcb9d..00000000 --- a/vendor/github.com/tsenart/go-tsz/VERSION +++ /dev/null @@ -1 +0,0 @@ -1.0.0 diff --git a/vendor/github.com/tsenart/go-tsz/bstream.go b/vendor/github.com/tsenart/go-tsz/bstream.go deleted file mode 100644 index 094dc94b..00000000 --- a/vendor/github.com/tsenart/go-tsz/bstream.go +++ /dev/null @@ -1,222 +0,0 @@ -package tsz - -import ( - "bytes" - "encoding/binary" - "io" -) - -// bstream is a stream of bits -type bstream struct { - // the data stream - stream []byte - - // how many bits are valid in current byte - count uint8 -} - -func newBReader(b []byte) *bstream { - return &bstream{stream: b, count: 8} -} - -func newBWriter(size int) *bstream { - return &bstream{stream: make([]byte, 0, size), count: 0} -} - -func (b *bstream) clone() *bstream { - d := make([]byte, len(b.stream)) - copy(d, b.stream) - return &bstream{stream: d, count: b.count} -} - -func (b *bstream) bytes() []byte { - return b.stream -} - -type bit bool - -const ( - zero bit = false - one bit = true -) - -func (b *bstream) writeBit(bit bit) { - - if b.count == 0 { - b.stream = append(b.stream, 0) - b.count = 8 - } - - i := len(b.stream) - 1 - - if bit { - b.stream[i] |= 1 << (b.count - 1) - } - - b.count-- -} - -func (b *bstream) writeByte(byt byte) { - - if b.count == 0 { - b.stream = append(b.stream, 0) - b.count = 8 - } - - i := len(b.stream) - 1 - - // fill up b.b with b.count bits from byt - b.stream[i] |= byt >> (8 - b.count) - - b.stream = append(b.stream, 0) - i++ - b.stream[i] = byt << b.count -} - -func (b *bstream) writeBits(u uint64, nbits int) { - u <<= (64 - uint(nbits)) - for nbits >= 8 { - byt := byte(u >> 56) - b.writeByte(byt) - u <<= 8 - nbits -= 8 - } - - for nbits > 0 { - b.writeBit((u >> 63) == 1) - u <<= 1 - nbits-- - } -} - -func (b *bstream) readBit() (bit, error) { - - if len(b.stream) == 0 { - return false, io.EOF - } - - if b.count == 0 { - b.stream = b.stream[1:] - // did we just run out of stuff to read? - if len(b.stream) == 0 { - return false, io.EOF - } - b.count = 8 - } - - b.count-- - d := b.stream[0] & 0x80 - b.stream[0] <<= 1 - return d != 0, nil -} - -func (b *bstream) readByte() (byte, error) { - - if len(b.stream) == 0 { - return 0, io.EOF - } - - if b.count == 0 { - b.stream = b.stream[1:] - - if len(b.stream) == 0 { - return 0, io.EOF - } - - b.count = 8 - } - - if b.count == 8 { - b.count = 0 - return b.stream[0], nil - } - - byt := b.stream[0] - b.stream = b.stream[1:] - - if len(b.stream) == 0 { - return 0, io.EOF - } - - byt |= b.stream[0] >> b.count - b.stream[0] <<= (8 - b.count) - - return byt, nil -} - -func (b *bstream) readBits(nbits int) (uint64, error) { - - var u uint64 - - for nbits >= 8 { - byt, err := b.readByte() - if err != nil { - return 0, err - } - - u = (u << 8) | uint64(byt) - nbits -= 8 - } - - if nbits == 0 { - return u, nil - } - - if nbits > int(b.count) { - u = (u << uint(b.count)) | uint64(b.stream[0]>>(8-b.count)) - nbits -= int(b.count) - b.stream = b.stream[1:] - - if len(b.stream) == 0 { - return 0, io.EOF - } - b.count = 8 - } - - u = (u << uint(nbits)) | uint64(b.stream[0]>>(8-uint(nbits))) - b.stream[0] <<= uint(nbits) - b.count -= uint8(nbits) - return u, nil -} - -// Read until next unset bit is found or until nbits bits have been read. -func (b *bstream) readUntilZero(nbits int) (uint64, error) { - var u uint64 - for i := 0; i < nbits; i++ { - u <<= 1 - bit, err := b.readBit() - if err != nil { - return 0, err - } - if bit == zero { - break - } - u |= 1 - } - return u, nil -} - -// MarshalBinary implements the encoding.BinaryMarshaler interface -func (b *bstream) MarshalBinary() ([]byte, error) { - buf := new(bytes.Buffer) - err := binary.Write(buf, binary.BigEndian, b.count) - if err != nil { - return nil, err - } - err = binary.Write(buf, binary.BigEndian, b.stream) - if err != nil { - return nil, err - } - return buf.Bytes(), nil -} - -// UnmarshalBinary implements the encoding.BinaryUnmarshaler interface -func (b *bstream) UnmarshalBinary(bIn []byte) error { - buf := bytes.NewReader(bIn) - err := binary.Read(buf, binary.BigEndian, &b.count) - if err != nil { - return err - } - b.stream = make([]byte, buf.Len()) - return binary.Read(buf, binary.BigEndian, &b.stream) -} diff --git a/vendor/github.com/tsenart/go-tsz/fuzz.go b/vendor/github.com/tsenart/go-tsz/fuzz.go deleted file mode 100644 index bee28030..00000000 --- a/vendor/github.com/tsenart/go-tsz/fuzz.go +++ /dev/null @@ -1,69 +0,0 @@ -// +build gofuzz - -package tsz - -import ( - "encoding/binary" - "fmt" - "math" - - "github.com/tsenart/go-tsz/testdata" -) - -func Fuzz(data []byte) int { - - fuzzUnpack(data) - - if len(data) < 9 { - return 0 - } - - t0 := uint32(1456236677) - - v := float64(10000) - - var vals []testdata.Point - s := New(t0) - t := t0 - for len(data) >= 10 { - tdelta := uint32(binary.LittleEndian.Uint16(data)) - if t == t0 { - tdelta &= (1 << 14) - 1 - } - t += tdelta - data = data[2:] - v += float64(int16(binary.LittleEndian.Uint16(data))) + float64(binary.LittleEndian.Uint16(data[2:]))/float64(math.MaxUint16) - data = data[8:] - vals = append(vals, testdata.Point{V: v, T: t}) - s.Push(t, v) - } - - it := s.Iter() - - var i int - for it.Next() { - gt, gv := it.Values() - if gt != vals[i].T || (gv != vals[i].V || math.IsNaN(gv) && math.IsNaN(vals[i].V)) { - panic(fmt.Sprintf("failure: gt=%v vals[i].T=%v gv=%v vals[i].V=%v", gt, vals[i].T, gv, vals[i].V)) - } - i++ - } - - if i != len(vals) { - panic("extra data") - } - - return 1 -} - -func fuzzUnpack(data []byte) { - - it, err := NewIterator(data) - if err != nil { - return - } - - for it.Next() { - _, _ = it.Values() - } -} diff --git a/vendor/github.com/tsenart/go-tsz/testdata/data.go b/vendor/github.com/tsenart/go-tsz/testdata/data.go deleted file mode 100644 index 357d8201..00000000 --- a/vendor/github.com/tsenart/go-tsz/testdata/data.go +++ /dev/null @@ -1,264 +0,0 @@ -package testdata - -type Point struct { - T uint64 - V float64 -} - -var Data = []Point{ - {1500400800000, 60000}, - {1500405481623, 69087}, - {1500405488693, 65640}, - {1500405495993, 58155}, - {1500405503743, 61025}, - {1500405511623, 91156}, - {1500405519803, 37516}, - {1500405528313, 93515}, - {1500405537233, 96226}, - {1500405546453, 23833}, - {1500405556103, 73186}, - {1500405566143, 96947}, - {1500405576163, 46927}, - {1500405586173, 77954}, - {1500405596183, 29302}, - {1500405606213, 6700}, - {1500405616163, 71971}, - {1500405625813, 8528}, - {1500405635763, 85321}, - {1500405645634, 83229}, - {1500405655633, 78298}, - {1500405665623, 87122}, - {1500405675623, 82055}, - {1500405685723, 75067}, - {1500405695663, 33680}, - {1500405705743, 17576}, - {1500405715813, 89701}, - {1500405725773, 21427}, - {1500405735883, 58255}, - {1500405745903, 3768}, - {1500405755863, 62086}, - {1500405765843, 66965}, - {1500405775773, 35801}, - {1500405785883, 72169}, - {1500405795843, 43089}, - {1500405805733, 31418}, - {1500405815853, 84781}, - {1500405825963, 36103}, - {1500405836004, 87431}, - {1500405845953, 7379}, - {1500405855913, 66919}, - {1500405865963, 30906}, - {1500405875953, 88630}, - {1500405885943, 27546}, - {1500405896033, 43813}, - {1500405906094, 2124}, - {1500405916063, 49399}, - {1500405926143, 94577}, - {1500405936123, 98459}, - {1500405946033, 49457}, - {1500405956023, 92838}, - {1500405966023, 15628}, - {1500405976043, 53916}, - {1500405986063, 90387}, - {1500405996123, 43176}, - {1500406006123, 18838}, - {1500406016174, 78847}, - {1500406026173, 39591}, - {1500406036004, 77070}, - {1500406045964, 56788}, - {1500406056043, 96706}, - {1500406066123, 20756}, - {1500406076113, 64433}, - {1500406086133, 45791}, - {1500406096123, 75028}, - {1500406106193, 55403}, - {1500406116213, 36991}, - {1500406126073, 92929}, - {1500406136103, 60416}, - {1500406146183, 55485}, - {1500406156383, 53525}, - {1500406166313, 96021}, - {1500406176414, 22705}, - {1500406186613, 89801}, - {1500406196543, 51975}, - {1500406206483, 86741}, - {1500406216483, 22440}, - {1500406226433, 51818}, - {1500406236403, 61965}, - {1500406246413, 19074}, - {1500406256494, 54521}, - {1500406266413, 59315}, - {1500406276303, 19171}, - {1500406286213, 98800}, - {1500406296183, 7086}, - {1500406306103, 60578}, - {1500406316073, 96828}, - {1500406326143, 83746}, - {1500406336153, 85481}, - {1500406346113, 22346}, - {1500406356133, 80976}, - {1500406366065, 43586}, - {1500406376074, 82500}, - {1500406386184, 13576}, - {1500406396113, 77871}, - {1500406406094, 60978}, - {1500406416203, 35264}, - {1500406426323, 79733}, - {1500406436343, 29140}, - {1500406446323, 7237}, - {1500406456344, 52866}, - {1500406466393, 88456}, - {1500406476493, 33533}, - {1500406486524, 96961}, - {1500406496453, 16389}, - {1500406506453, 31181}, - {1500406516433, 63282}, - {1500406526433, 92857}, - {1500406536413, 4582}, - {1500406546383, 46832}, - {1500406556473, 6335}, - {1500406566413, 44367}, - {1500406576513, 84640}, - {1500406586523, 36174}, - {1500406596553, 40075}, - {1500406606603, 80886}, - {1500406616623, 43784}, - {1500406626623, 25077}, - {1500406636723, 18617}, - {1500406646723, 72681}, - {1500406656723, 84811}, - {1500406666783, 90053}, - {1500406676685, 25708}, - {1500406686713, 57134}, - {1500406696673, 87193}, - {1500406706743, 66057}, - {1500406716724, 51404}, - {1500406726753, 90141}, - {1500406736813, 10434}, - {1500406746803, 29056}, - {1500406756833, 48160}, - {1500406766924, 96652}, - {1500406777113, 64141}, - {1500406787113, 22143}, - {1500406797093, 20561}, - {1500406807113, 66401}, - {1500406817283, 76802}, - {1500406827284, 37555}, - {1500406837323, 63169}, - {1500406847463, 45712}, - {1500406857513, 44751}, - {1500406867523, 98891}, - {1500406877523, 38122}, - {1500406887623, 46202}, - {1500406897703, 5875}, - {1500406907663, 17397}, - {1500406917603, 39994}, - {1500406927633, 82385}, - {1500406937623, 15598}, - {1500406947693, 36235}, - {1500406957703, 97536}, - {1500406967673, 28557}, - {1500406977723, 13985}, - {1500406987663, 64304}, - {1500406997573, 83693}, - {1500407007494, 6574}, - {1500407017493, 25134}, - {1500407027503, 50383}, - {1500407037523, 55922}, - {1500407047603, 73436}, - {1500407057473, 68235}, - {1500407067553, 1469}, - {1500407077463, 44315}, - {1500407087463, 95064}, - {1500407097443, 1997}, - {1500407107473, 17247}, - {1500407117453, 42454}, - {1500407127413, 73631}, - {1500407137363, 96890}, - {1500407147343, 43450}, - {1500407157363, 42042}, - {1500407167403, 83014}, - {1500407177473, 32051}, - {1500407187523, 69280}, - {1500407197495, 21425}, - {1500407207453, 93748}, - {1500407217413, 64151}, - {1500407227443, 38791}, - {1500407237463, 5248}, - {1500407247523, 92935}, - {1500407257513, 18516}, - {1500407267584, 98870}, - {1500407277573, 82244}, - {1500407287723, 65464}, - {1500407297723, 33801}, - {1500407307673, 18331}, - {1500407317613, 89744}, - {1500407327553, 98460}, - {1500407337503, 24709}, - {1500407347423, 8407}, - {1500407357383, 69451}, - {1500407367333, 51100}, - {1500407377373, 25309}, - {1500407387443, 16148}, - {1500407397453, 98974}, - {1500407407543, 80284}, - {1500407417583, 170}, - {1500407427453, 34706}, - {1500407437433, 39681}, - {1500407447603, 6140}, - {1500407457513, 64595}, - {1500407467564, 59862}, - {1500407477563, 53795}, - {1500407487593, 83493}, - {1500407497584, 90639}, - {1500407507623, 16777}, - {1500407517613, 11096}, - {1500407527673, 38512}, - {1500407537963, 52759}, - {1500407548023, 79567}, - {1500407558033, 48664}, - {1500407568113, 10710}, - {1500407578164, 25635}, - {1500407588213, 40985}, - {1500407598163, 94089}, - {1500407608163, 50056}, - {1500407618223, 15550}, - {1500407628143, 78823}, - {1500407638223, 9044}, - {1500407648173, 20782}, - {1500407658023, 86390}, - {1500407667903, 79444}, - {1500407677903, 84051}, - {1500407687923, 91554}, - {1500407697913, 58777}, - {1500407708003, 89474}, - {1500407718083, 94026}, - {1500407728034, 41613}, - {1500407738083, 64667}, - {1500407748034, 5160}, - {1500407758003, 45140}, - {1500407768033, 53704}, - {1500407778083, 68097}, - {1500407788043, 81137}, - {1500407798023, 59657}, - {1500407808033, 56572}, - {1500407817983, 1993}, - {1500407828063, 62608}, - {1500407838213, 76489}, - {1500407848203, 22147}, - {1500407858253, 92829}, - {1500407868073, 48499}, - {1500407878053, 89152}, - {1500407888073, 9191}, - {1500407898033, 49881}, - {1500407908113, 96020}, - {1500407918213, 90203}, - {1500407928234, 32217}, - {1500407938253, 94302}, - {1500407948293, 83111}, - {1500407958234, 75576}, - {1500407968073, 5973}, - {1500407978023, 5175}, - {1500407987923, 63350}, - {1500407997833, 44081}, -} diff --git a/vendor/github.com/tsenart/go-tsz/tsz.go b/vendor/github.com/tsenart/go-tsz/tsz.go deleted file mode 100644 index 475db1b6..00000000 --- a/vendor/github.com/tsenart/go-tsz/tsz.go +++ /dev/null @@ -1,385 +0,0 @@ -// Package tsz implement time-series compression -/* - -http://www.vldb.org/pvldb/vol8/p1816-teller.pdf - -*/ -package tsz - -import ( - "bytes" - "encoding/binary" - "io" - "math" - "math/bits" - "sync" -) - -// Series is the basic series primitive -// you can concurrently put values, finish the stream, and create iterators -type Series struct { - sync.Mutex - - T0 uint64 - t uint64 - val float64 - - bw bstream - leading uint8 - trailing uint8 - finished bool - - tDelta uint32 -} - -// New series -func New(t0 uint64) *Series { - s := Series{ - T0: t0, - leading: ^uint8(0), - } - - // block header - s.bw.writeBits(uint64(t0), 64) - - return &s - -} - -// Bytes value of the series stream -func (s *Series) Bytes() []byte { - s.Lock() - defer s.Unlock() - return s.bw.bytes() -} - -func finish(w *bstream) { - // write an end-of-stream record - w.writeBits(0x0f, 4) - w.writeBits(0xffffffff, 32) - w.writeBit(zero) -} - -// Finish the series by writing an end-of-stream record -func (s *Series) Finish() { - s.Lock() - if !s.finished { - finish(&s.bw) - s.finished = true - } - s.Unlock() -} - -// Push a timestamp and value to the series. -// Values must be inserted in monotonically increasing time order. -func (s *Series) Push(t uint64, v float64) { - s.Lock() - defer s.Unlock() - - if s.t == 0 { - // first point - s.t = t - s.val = v - s.tDelta = uint32(t - s.T0) - s.bw.writeBits(uint64(s.tDelta), 27) - s.bw.writeBits(math.Float64bits(v), 64) - return - } - - // Difference to the original Facebook paper, we store the first delta as 27 - // bits to allow millisecond accuracy for a one day block. - tDelta := uint32(t - s.t) - d := int32(tDelta - s.tDelta) - - if d == 0 { - s.bw.writeBit(zero) - } else { - // Increase by one in the decompressing phase as we have one free bit - switch dod := encodeZigZag32(d) - 1; 32 - bits.LeadingZeros32(dod) { - case 1, 2, 3, 4, 5, 6, 7: - s.bw.writeBits(uint64(dod|256), 9) // dod | 00000000000000000000000100000000 - case 8, 9: - s.bw.writeBits(uint64(dod|3072), 12) // dod | 00000000000000000000110000000000 - case 10, 11, 12: - s.bw.writeBits(uint64(dod|57344), 16) // dod | 00000000000000001110000000000000 - default: - s.bw.writeBits(0x0f, 4) // '1111' - s.bw.writeBits(uint64(dod), 32) - } - } - - vDelta := math.Float64bits(s.val) ^ math.Float64bits(v) - - if vDelta == 0 { - s.bw.writeBit(zero) - } else { - leading := uint8(bits.LeadingZeros64(vDelta)) - trailing := uint8(bits.TrailingZeros64(vDelta)) - - s.bw.writeBit(one) - - if leading >= s.leading && trailing >= s.trailing { - s.bw.writeBit(zero) - s.bw.writeBits(vDelta>>s.trailing, 64-int(s.leading)-int(s.trailing)) - } else { - s.bw.writeBit(one) - - // Different from version 1.x, use (significantBits - 1) in storage - avoids a branch - sigbits := 64 - leading - trailing - - // Different from original, bits 5 -> 6, avoids a branch, allows storing small longs - s.bw.writeBits(uint64(leading), 6) // Number of leading zeros in the next 6 bits - s.bw.writeBits(uint64(sigbits-1), 6) // Length of meaningful bits in the next 6 bits - s.bw.writeBits(vDelta>>trailing, int(sigbits)) // Store the meaningful bits of XOR - - s.leading, s.trailing = leading, trailing - } - } - - s.tDelta = tDelta - s.t = t - s.val = v - -} - -// Iter lets you iterate over a series. It is not concurrency-safe. -func (s *Series) Iter() *Iter { - s.Lock() - w := s.bw.clone() - s.Unlock() - - finish(w) - iter, _ := bstreamIterator(w) - return iter -} - -// Iter lets you iterate over a series. It is not concurrency-safe. -type Iter struct { - T0 uint64 - - t uint64 - val float64 - - br bstream - leading uint8 - trailing uint8 - - finished bool - - tDelta uint32 - err error -} - -func bstreamIterator(br *bstream) (*Iter, error) { - - br.count = 8 - - t0, err := br.readBits(64) - if err != nil { - return nil, err - } - - return &Iter{ - T0: uint64(t0), - br: *br, - }, nil -} - -// NewIterator for the series -func NewIterator(b []byte) (*Iter, error) { - return bstreamIterator(newBReader(b)) -} - -// Next iteration of the series iterator -func (it *Iter) Next() bool { - - if it.err != nil || it.finished { - return false - } - - if it.t == 0 { - // read first t and v - tDelta, err := it.br.readBits(27) - if err != nil { - it.err = err - return false - } - - if tDelta == (1<<27)-1 { - it.finished = true - return false - } - - it.tDelta = uint32(tDelta) - it.t = it.T0 + tDelta - v, err := it.br.readBits(64) - if err != nil { - it.err = err - return false - } - - it.val = math.Float64frombits(v) - - return true - } - - // read delta-of-delta - d, err := it.br.readUntilZero(4) - if err != nil { - it.err = err - return false - } - - if d != 0 { - var sz uint - switch d { - case 0x02: - sz = 7 - case 0x06: - sz = 9 - case 0x0e: - sz = 12 - case 0x0f: - sz = 32 - } - - bits, err := it.br.readBits(int(sz)) - if err != nil { - it.err = err - return false - } - - if sz == 32 && bits == 0xffffffff { - it.finished = true - return false - } - - dod := decodeZigZag32(uint32(int64(bits) + 1)) - it.tDelta += uint32(dod) - } - - it.t += uint64(it.tDelta) - - val, err := it.br.readUntilZero(2) - if err != nil { - it.err = err - return false - } - - switch val { - case 3: - bits, err := it.br.readBits(6) - if err != nil { - it.err = err - return false - } - it.leading = uint8(bits) - - bits, err = it.br.readBits(6) - if err != nil { - it.err = err - return false - } - it.trailing = 64 - (uint8(bits) + 1) - it.leading - - fallthrough - case 2: - bits, err := it.br.readBits(int(64 - it.leading - it.trailing)) - if err != nil { - it.err = err - return false - } - it.val = math.Float64frombits(math.Float64bits(it.val) ^ (bits << it.trailing)) - } - - return true -} - -// Values at the current iterator position -func (it *Iter) Values() (uint64, float64) { - return it.t, it.val -} - -// Err error at the current iterator position -func (it *Iter) Err() error { - return it.err -} - -type errMarshal struct { - w io.Writer - r io.Reader - err error -} - -func (em *errMarshal) write(t interface{}) { - if em.err != nil { - return - } - em.err = binary.Write(em.w, binary.BigEndian, t) -} - -func (em *errMarshal) read(t interface{}) { - if em.err != nil { - return - } - em.err = binary.Read(em.r, binary.BigEndian, t) -} - -// MarshalBinary implements the encoding.BinaryMarshaler interface -func (s *Series) MarshalBinary() ([]byte, error) { - buf := new(bytes.Buffer) - em := &errMarshal{w: buf} - em.write(s.T0) - em.write(s.leading) - em.write(s.t) - em.write(s.tDelta) - em.write(s.trailing) - em.write(s.val) - bStream, err := s.bw.MarshalBinary() - if err != nil { - return nil, err - } - em.write(bStream) - if em.err != nil { - return nil, em.err - } - return buf.Bytes(), nil -} - -// UnmarshalBinary implements the encoding.BinaryUnmarshaler interface -func (s *Series) UnmarshalBinary(b []byte) error { - buf := bytes.NewReader(b) - em := &errMarshal{r: buf} - em.read(&s.T0) - em.read(&s.leading) - em.read(&s.t) - em.read(&s.tDelta) - em.read(&s.trailing) - em.read(&s.val) - outBuf := make([]byte, buf.Len()) - em.read(outBuf) - err := s.bw.UnmarshalBinary(outBuf) - if err != nil { - return err - } - if em.err != nil { - return em.err - } - return nil -} - -// Maps negative values to positive values while going back and -// forth (0 = 0, -1 = 1, 1 = 2, -2 = 3, 2 = 4, -3 = 5, 3 = 6 ...) -// Encodes signed integers into unsigned integers that can be efficiently -// encoded with varint because negative values must be sign-extended to 64 bits to -// be varint encoded, thus always taking 10 bytes on the wire. -// -// Read more: https://gist.github.com/mfuerstenau/ba870a29e16536fdbaba -func encodeZigZag32(n int32) uint32 { - // Note: The right-shift must be arithmetic which it is in Go. - return uint32(n>>31) ^ (uint32(n) << 1) -} - -func decodeZigZag32(n uint32) int32 { - return int32((n >> 1) ^ uint32((int32(n&1)<<31)>>31)) -} diff --git a/vendor/github.com/tsenart/vegeta/.gitignore b/vendor/github.com/tsenart/vegeta/.gitignore deleted file mode 100644 index d0c0e875..00000000 --- a/vendor/github.com/tsenart/vegeta/.gitignore +++ /dev/null @@ -1,34 +0,0 @@ -# Compiled Object files, Static and Dynamic libs (Shared Objects) -*.o -*.a -*.so - -# Folders -_obj -_test - -# Architecture specific extensions/prefixes -*.[568vq] -[568vq].out - -*.cgo1.go -*.cgo2.c -_cgo_defun.c -_cgo_gotypes.go -_cgo_export.* - -_testmain.go - -*.exe - -vegeta -vegeta.test -vegeta-*.tar.gz -lib/lib.test -dist -vendor - -*.gob -*.lz - -.DS_Store diff --git a/vendor/github.com/tsenart/vegeta/.goreleaser.yml b/vendor/github.com/tsenart/vegeta/.goreleaser.yml deleted file mode 100644 index 9a51a899..00000000 --- a/vendor/github.com/tsenart/vegeta/.goreleaser.yml +++ /dev/null @@ -1,35 +0,0 @@ -builds: -- goos: - - freebsd - - linux - - darwin - - windows - goarch: - - amd64 - - arm64 - - arm - goarm: - - 7 - env: - - CGO_ENABLED=0 - flags: - - -a - - -tags="netgo" - ldflags: - - -s -w -extldflags "-static" -X main.Version={{.Version}} -X main.Commit={{.Commit}} -X main.Date={{.Date}}" - -release: - name_template: "v{{.Version}}" - -archive: - name_template: "{{.ProjectName}}-{{.Version}}-{{.Os}}-{{.Arch}}" - format: tar.gz - format_overrides: - - goos: windows - format: zip - -checksum: - name_template: "{{ .ProjectName }}-checksums.txt" - -sign: - artifacts: checksum diff --git a/vendor/github.com/tsenart/vegeta/.travis.yml b/vendor/github.com/tsenart/vegeta/.travis.yml deleted file mode 100644 index 3f24fdb3..00000000 --- a/vendor/github.com/tsenart/vegeta/.travis.yml +++ /dev/null @@ -1,12 +0,0 @@ -language: go -sudo: false -go: - - tip -install: - - go get -v golang.org/x/lint/golint - - go get -d -t -v ./... - - go build -v ./... -script: - - go vet ./... - - $HOME/gopath/bin/golint -set_exit_status $(go list ./... | grep -v /vendor/) - - go test -v ./... diff --git a/vendor/github.com/tsenart/vegeta/CHANGELOG b/vendor/github.com/tsenart/vegeta/CHANGELOG deleted file mode 100644 index 9d397be2..00000000 --- a/vendor/github.com/tsenart/vegeta/CHANGELOG +++ /dev/null @@ -1,87 +0,0 @@ -2018-05-18: v7.0.0 - Include response body in hit results (#279) - Added support for h2c requests (HTTP/2 without TLS) (#261) - Prevent "null" Metrics.Errors JSON encoding (#277) - Add option to override HTTP Proxy on Attacker (#234) - -2017-03-19: v6.3.0 - Mark responses as success in no redirect following mode (#222) - -2017-03-04: v6.2.0 - Allow any upper-case ASCII word to be an HTTP method (#217) - Correctly compute Metrics.Rate with sub-second duration results (#208) - -2016-08-26: v6.1.1 - Respect case sensitivity in target file header names (#195, #191) - -2016-04-03: v6.1.0 - Add HTTP2 support - -2015-11-27: v6.0.0 - Insecure attack flag (#160) - Client certificates (#156) - Infinite attacks (#155) - Allow empty lines between targets (#147) - -2015-09-19: v5.9.0 - Bounded memory streaming reporters (#136) - -2015-09-04: v5.8.1 - Fix support for DELETE methods in targets - -2015-08-11: v5.8.0 - Change reporters quantile estimation method to match R's 8th type. - -2015-05-23: v5.7.1 - Revert end-to-end attack timeout change - -2015-05-23: v5.7.0 - Allow case sensitve headers in attacks - -2015-04-15: v5.6.3 - Expose connections flag in the attack command - Add global cpu and heap profiling flags - Measure actual attack rate and print it in relevant reporters - Major performance improvements that allow much higher attack rates - -2015-04-02: v5.6.2 - Update dygraph to latest version - Improve plot reporter screenshot rendering by using html2canvas.js - Improve plot reporter performance - -2015-03-23: v5.6.1 - Allow spaces in hist reporter flag format - -2015-03-12: v5.6.0 - Set default dumper to "json" in the dump command. - Add --version to global vegeta command flags. - Fix response body leak regression introduced in v5.5.3. - -2015-03-11: v5.5.3 - Always read response bodies for each request. - Homebrew install instructions. - -2015-01-3: v5.5.2 - Refactor core request logic and simplify tests with a 4x speedup. - -2015-01-2: v5.5.1 - Treat bad status codes as errors. - -2014-11-21: v5.5.0 - Implement dump command with CSV and JSON record format. - Optionally ignore redirects and treat them as successes. - -2014-11-16: v5.4.0 - Add histogram reporter to the report command. - -2014-11-16: v5.3.0 - Add support for extended targets dsl that supports per-target headers and body. - Target file comments support has been removed. - -2014-11-7: v5.2.0 - Don't treat 3xx status codes as errors. - Add -keepalive flag to the attack command. - -2014-11-3: v5.1.1 - Add FreeBSD and Windows releases. - Fix non termination bug in the report command. #85 diff --git a/vendor/github.com/tsenart/vegeta/Gopkg.lock b/vendor/github.com/tsenart/vegeta/Gopkg.lock deleted file mode 100644 index b6d17b34..00000000 --- a/vendor/github.com/tsenart/vegeta/Gopkg.lock +++ /dev/null @@ -1,169 +0,0 @@ -# This file is autogenerated, do not edit; changes may be undone by the next 'dep ensure'. - - -[[projects]] - branch = "master" - digest = "1:c312c313bb8040fcfb5698f38b51ec279e4635c7619773e6f018c908586c64b1" - name = "github.com/alecthomas/jsonschema" - packages = ["."] - pruneopts = "UT" - revision = "f2c93856175a7dd6abe88c5c3900b67ad054adcc" - -[[projects]] - branch = "master" - digest = "1:f31b92722c6eca05df9ba28e9cb38d94de0865f034fff164557f103d6d13b612" - name = "github.com/bmizerany/perks" - packages = ["quantile"] - pruneopts = "UT" - revision = "d9a9656a3a4b1c2864fdb44db2ef8619772d92aa" - -[[projects]] - branch = "master" - digest = "1:e8891cd354f2af940345f895d5698ab1ed439196d4f69eb44817fc91e80354c1" - name = "github.com/c2h5oh/datasize" - packages = ["."] - pruneopts = "UT" - revision = "4eba002a5eaea69cf8d235a388fc6b65ae68d2dd" - -[[projects]] - branch = "master" - digest = "1:5c4cefdd3ba39aee4e4b6f9aad121a79fd2a989b9b54acbe4f530cc3a700cd75" - name = "github.com/dgryski/go-gk" - packages = ["."] - pruneopts = "UT" - revision = "201884a44051d8544b65e6b1c05ae71c0c45b9e0" - -[[projects]] - branch = "master" - digest = "1:bc4e2b6c1af97c03fe850864bf22574abc6ad0fcbf0e5dda0fd246d3d43f9ccb" - name = "github.com/dgryski/go-lttb" - packages = ["."] - pruneopts = "UT" - revision = "318fcdf10a77c2df09d83777e41f5e18d236ec9d" - -[[projects]] - digest = "1:2e3c336fc7fde5c984d2841455a658a6d626450b1754a854b3b32e7a8f49a07a" - name = "github.com/google/go-cmp" - packages = [ - "cmp", - "cmp/internal/diff", - "cmp/internal/function", - "cmp/internal/value", - ] - pruneopts = "UT" - revision = "3af367b6b30c263d47e8895973edcca9a49cf029" - version = "v0.2.0" - -[[projects]] - branch = "master" - digest = "1:b07e7ba2bb99a70ce3318ea387a62666371c1ab4f9bfcae192a59e3f4b8ffa56" - name = "github.com/influxdata/tdigest" - packages = ["."] - pruneopts = "UT" - revision = "a7d76c6f093a59b94a01c6c2b8429122d444a8cc" - -[[projects]] - branch = "master" - digest = "1:aa3d8d42865c42626b5c1add193692d045b3188b1479f0a0a88690d21fe20083" - name = "github.com/mailru/easyjson" - packages = [ - ".", - "buffer", - "jlexer", - "jwriter", - ] - pruneopts = "UT" - revision = "60711f1a8329503b04e1c88535f419d0bb440bff" - -[[projects]] - branch = "master" - digest = "1:7ca2584fa7da0520cd2d1136a10194fe5a5b220bdb215074ab6f7b5ad91115f4" - name = "github.com/shurcooL/httpfs" - packages = ["vfsutil"] - pruneopts = "UT" - revision = "809beceb23714880abc4a382a00c05f89d13b1cc" - -[[projects]] - branch = "master" - digest = "1:b5db31f108c72b9de4e36ca3222a4e325beebfa492a9d3f62f313ffa9cdab3b7" - name = "github.com/shurcooL/vfsgen" - packages = ["."] - pruneopts = "UT" - revision = "62bca832be04bd2bcaabd3b68a6b19a7ec044411" - -[[projects]] - branch = "master" - digest = "1:383e656d30a7bd2c663514940748c189307134c65ec8c7b2070ed01abb93e73d" - name = "github.com/streadway/quantile" - packages = ["."] - pruneopts = "UT" - revision = "b0c588724d25ae13f5afb3d90efec0edc636432b" - -[[projects]] - branch = "master" - digest = "1:be87c1e6f0a15e5b1c45036b9382cdd63057a8b65e10ff2fe2bda23886a99c6a" - name = "github.com/tsenart/go-tsz" - packages = [ - ".", - "testdata", - ] - pruneopts = "UT" - revision = "cdeb9e1e981e85dafc95428f5da9cba59cbcc828" - -[[projects]] - branch = "master" - digest = "1:dca4094c3be476189bd5854752edbd1bd3d15e61d9570dd9133744bb1ecd599d" - name = "golang.org/x/net" - packages = [ - "http/httpguts", - "http2", - "http2/hpack", - "idna", - ] - pruneopts = "UT" - revision = "c39426892332e1bb5ec0a434a079bf82f5d30c54" - -[[projects]] - digest = "1:a2ab62866c75542dd18d2b069fec854577a20211d7c0ea6ae746072a1dccdd18" - name = "golang.org/x/text" - packages = [ - "collate", - "collate/build", - "internal/colltab", - "internal/gen", - "internal/tag", - "internal/triegen", - "internal/ucd", - "language", - "secure/bidirule", - "transform", - "unicode/bidi", - "unicode/cldr", - "unicode/norm", - "unicode/rangetable", - ] - pruneopts = "UT" - revision = "f21a4dfb5e38f5895301dc265a8def02365cc3d0" - version = "v0.3.0" - -[solve-meta] - analyzer-name = "dep" - analyzer-version = 1 - input-imports = [ - "github.com/alecthomas/jsonschema", - "github.com/bmizerany/perks/quantile", - "github.com/c2h5oh/datasize", - "github.com/dgryski/go-gk", - "github.com/dgryski/go-lttb", - "github.com/google/go-cmp/cmp", - "github.com/influxdata/tdigest", - "github.com/mailru/easyjson", - "github.com/mailru/easyjson/jlexer", - "github.com/mailru/easyjson/jwriter", - "github.com/shurcooL/vfsgen", - "github.com/streadway/quantile", - "github.com/tsenart/go-tsz", - "golang.org/x/net/http2", - ] - solver-name = "gps-cdcl" - solver-version = 1 diff --git a/vendor/github.com/tsenart/vegeta/Gopkg.toml b/vendor/github.com/tsenart/vegeta/Gopkg.toml deleted file mode 100644 index 1794f102..00000000 --- a/vendor/github.com/tsenart/vegeta/Gopkg.toml +++ /dev/null @@ -1,74 +0,0 @@ -# Gopkg.toml example -# -# Refer to https://github.com/golang/dep/blob/master/docs/Gopkg.toml.md -# 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 - - -[[constraint]] - branch = "master" - name = "github.com/alecthomas/jsonschema" - -[[constraint]] - branch = "master" - name = "github.com/bmizerany/perks" - -[[constraint]] - branch = "master" - name = "github.com/dgryski/go-gk" - -[[constraint]] - branch = "master" - name = "github.com/dgryski/go-lttb" - -[[constraint]] - branch = "master" - name = "github.com/tsenart/go-tsz" - -[[constraint]] - branch = "master" - name = "github.com/influxdata/tdigest" - -[[constraint]] - branch = "master" - name = "github.com/streadway/quantile" - -[[constraint]] - branch = "master" - name = "golang.org/x/net" - -[[constraint]] - branch = "master" - name = "github.com/shurcooL/vfsgen" - -[prune] - go-tests = true - unused-packages = true - -[[constraint]] - branch = "master" - name = "github.com/c2h5oh/datasize" - -[[constraint]] - branch = "master" - name = "github.com/mailru/easyjson" diff --git a/vendor/github.com/tsenart/vegeta/LICENSE b/vendor/github.com/tsenart/vegeta/LICENSE deleted file mode 100644 index 441df0ab..00000000 --- a/vendor/github.com/tsenart/vegeta/LICENSE +++ /dev/null @@ -1,20 +0,0 @@ -The MIT License (MIT) - -Copyright (c) 2013-2016 Tomás Senart - -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/tsenart/vegeta/Makefile b/vendor/github.com/tsenart/vegeta/Makefile deleted file mode 100644 index be3e95ed..00000000 --- a/vendor/github.com/tsenart/vegeta/Makefile +++ /dev/null @@ -1,25 +0,0 @@ -COMMIT=$(shell git rev-parse HEAD) -VERSION=$(shell git describe --tags --exact-match --always) -DATE=$(shell date +'%FT%TZ%z') - -vegeta: vendor generate - CGO_ENABLED=0 go build -v -a -tags=netgo \ - -ldflags '-s -w -extldflags "-static" -X main.Version=$(VERSION) -X main.Commit=$(COMMIT) -X main.Date=$(DATE)' - -clean-vegeta: - rm vegeta - -generate: vendor - go generate ./... - -vendor: - dep ensure -v - -clean-vendor: - rm -rf vendor - -dist: - goreleaser release --debug --skip-validate - -clean-dist: - rm -rf dist diff --git a/vendor/github.com/tsenart/vegeta/README.md b/vendor/github.com/tsenart/vegeta/README.md deleted file mode 100644 index 0307fa43..00000000 --- a/vendor/github.com/tsenart/vegeta/README.md +++ /dev/null @@ -1,803 +0,0 @@ -# Vegeta [![Build Status](https://secure.travis-ci.org/tsenart/vegeta.svg?branch=master)](http://travis-ci.org/tsenart/vegeta) [![Go Report Card](https://goreportcard.com/badge/github.com/tsenart/vegeta)](https://goreportcard.com/report/github.com/tsenart/vegeta) [![GoDoc](https://godoc.org/github.com/tsenart/vegeta?status.svg)](https://godoc.org/github.com/tsenart/vegeta) [![Gitter](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/tsenart/vegeta?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge) [![Donate](https://img.shields.io/badge/donate-bitcoin-yellow.svg)](#donate) - -Vegeta is a versatile HTTP load testing tool built out of a need to drill -HTTP services with a constant request rate. -It can be used both as a command line utility and a library. - -![Vegeta](http://fc09.deviantart.net/fs49/i/2009/198/c/c/ssj2_vegeta_by_trunks24.jpg) - -## Install - -### Pre-compiled executables - -Get them [here](http://github.com/tsenart/vegeta/releases). - -### Homebrew on Mac OS X - -You can install Vegeta using the [Homebrew](https://github.com/Homebrew/homebrew/) package manager on Mac OS X: - -```shell -$ brew update && brew install vegeta -``` - -### Source - -You need `go` installed and `GOBIN` in your `PATH`. Once that is done, run the -command: - -```shell -$ go get -u github.com/tsenart/vegeta -``` - -## Versioning - -Both the library and the CLI are versioned with [SemVer v2.0.0](https://semver.org/spec/v2.0.0.html). - -After [v8.0.0](https://github.com/tsenart/vegeta/tree/v8.0.0), the two components -are versioned separately to better isolate breaking changes to each. - -CLI releases are tagged with `cli/vMAJOR.MINOR.PATCH` and published on the [Github releases page](https://github.com/tsenart/vegeta/releases). -As for the library, new versions are tagged with both `lib/vMAJOR.MINOR.PATCH` and `vMAJOR.MINOR.PATCH`. -The latter tag is required for compatibility with `go mod`. - -## Contributing - -See [CONTRIBUTING.md](.github/CONTRIBUTING.md). - -## Usage manual - -```console -Usage: vegeta [global flags] [command flags] - -global flags: - -cpus int - Number of CPUs to use (defaults to the number of CPUs you have) - -profile string - Enable profiling of [cpu, heap] - -version - Print version and exit - -attack command: - -body string - Requests body file - -cert string - TLS client PEM encoded certificate file - -connections int - Max open idle connections per target host (default 10000) - -duration duration - Duration of the test [0 = forever] - -format string - Targets format [http, json] (default "http") - -h2c - Send HTTP/2 requests without TLS encryption - -header value - Request header - -http2 - Send HTTP/2 requests when supported by the server (default true) - -insecure - Ignore invalid server TLS certificates - -keepalive - Use persistent connections (default true) - -key string - TLS client PEM encoded private key file - -laddr value - Local IP address (default 0.0.0.0) - -lazy - Read targets lazily - -max-body value - Maximum number of bytes to capture from response bodies. [-1 = no limit] (default -1) - -max-workers uint - Maximum number of workers (default 18446744073709551615) - -name string - Attack name - -output string - Output file (default "stdout") - -rate value - Number of requests per time unit [0 = infinity] (default 50/1s) - -redirects int - Number of redirects to follow. -1 will not follow but marks as success (default 10) - -resolvers value - List of addresses (ip:port) to use for DNS resolution. Disables use of local system DNS. (comma separated list) - -root-certs value - TLS root certificate files (comma separated list) - -targets string - Targets file (default "stdin") - -timeout duration - Requests timeout (default 30s) - -unix-socket string - Connect over a unix socket. This overrides the host address in target URLs - -workers uint - Initial number of workers (default 10) - -encode command: - -output string - Output file (default "stdout") - -to string - Output encoding [csv, gob, json] (default "json") - -plot command: - -output string - Output file (default "stdout") - -threshold int - Threshold of data points above which series are downsampled. (default 4000) - -title string - Title and header of the resulting HTML page (default "Vegeta Plot") - -report command: - -buckets string - Histogram buckets, e.g.: "[0,1ms,10ms]" - -every duration - Report interval - -output string - Output file (default "stdout") - -type string - Report type to generate [text, json, hist[buckets], hdrplot] (default "text") - -examples: - echo "GET http://localhost/" | vegeta attack -duration=5s | tee results.bin | vegeta report - vegeta report -type=json results.bin > metrics.json - cat results.bin | vegeta plot > plot.html - cat results.bin | vegeta report -type="hist[0,100ms,200ms,300ms]" -``` - -#### `-cpus` - -Specifies the number of CPUs to be used internally. -It defaults to the amount of CPUs available in the system. - -#### `-profile` - -Specifies which profiler to enable during execution. Both _cpu_ and -_heap_ profiles are supported. It defaults to none. - -#### `-version` - -Prints the version and exits. - -### `attack` command - -#### `-body` - -Specifies the file whose content will be set as the body of every -request unless overridden per attack target, see `-targets`. - -#### `-cert` - -Specifies the PEM encoded TLS client certificate file to be used with HTTPS requests. -If `-key` isn't specified, it will be set to the value of this flag. - -#### `-connections` - -Specifies the maximum number of idle open connections per target host. - -#### `-duration` - -Specifies the amount of time to issue request to the targets. -The internal concurrency structure's setup has this value as a variable. -The actual run time of the test can be longer than specified due to the -responses delay. Use 0 for an infinite attack. - -#### `-format` - -Specifies the targets format to decode. - -##### `json` format - -The JSON format makes integration with programs that produce targets dynamically easier. -Each target is one JSON object in its own line. The method and url fields are required. -If present, the body field must be base64 encoded. The generated [JSON Schema](lib/target.schema.json) -defines the format in detail. - -```bash -jq -ncM '{method: "GET", url: "http://goku", body: "Punch!" | @base64, header: {"Content-Type": ["text/plain"]}}' | - vegeta attack -format=json -rate=100 | vegeta encode -``` - -##### `http` format - -The http format almost resembles the plain-text HTTP message format defined in -[RFC 2616](https://www.w3.org/Protocols/rfc2616/rfc2616-sec5.html) but it -doesn't support in-line HTTP bodies, only references to files that are loaded and used -as request bodies (as exemplified below). - -Although targets in this format can be produced by other programs, it was originally -meant to be used by people writing targets by hand for simple use cases. - -Here are a few examples of valid targets files in the http format: - -###### Simple targets - -``` -GET http://goku:9090/path/to/dragon?item=ball -GET http://user:password@goku:9090/path/to -HEAD http://goku:9090/path/to/success -``` - -###### Targets with custom headers - -``` -GET http://user:password@goku:9090/path/to -X-Account-ID: 8675309 - -DELETE http://goku:9090/path/to/remove -Confirmation-Token: 90215 -Authorization: Token DEADBEEF -``` - -###### Targets with custom bodies - -``` -POST http://goku:9090/things -@/path/to/newthing.json - -PATCH http://goku:9090/thing/71988591 -@/path/to/thing-71988591.json -``` - -###### Targets with custom bodies and headers - -``` -POST http://goku:9090/things -X-Account-ID: 99 -@/path/to/newthing.json -``` - -###### Add comments to the targets - -Lines starting with `#` are ignored. - -``` -# get a dragon ball -GET http://goku:9090/path/to/dragon?item=ball -``` - -#### `-h2c` - -Specifies that HTTP2 requests are to be sent over TCP without TLS encryption. - -#### `-header` - -Specifies a request header to be used in all targets defined, see `-targets`. -You can specify as many as needed by repeating the flag. - -#### `-http2` - -Specifies whether to enable HTTP/2 requests to servers which support it. - -#### `-insecure` - -Specifies whether to ignore invalid server TLS certificates. - -#### `-keepalive` - -Specifies whether to reuse TCP connections between HTTP requests. - -#### `-key` - -Specifies the PEM encoded TLS client certificate private key file to be -used with HTTPS requests. - -#### `-laddr` - -Specifies the local IP address to be used. - -#### `-lazy` - -Specifies whether to read the input targets lazily instead of eagerly. -This allows streaming targets into the attack command and reduces memory -footprint. -The trade-off is one of added latency in each hit against the targets. - -#### `-max-body` - -Specifies the maximum number of bytes to capture from the body of each -response. Remaining unread bytes will be fully read but discarded. -Set to -1 for no limit. It knows how to intepret values like these: - -- `"10 MB"` -> `10MB` -- `"10240 g"` -> `10TB` -- `"2000"` -> `2000B` -- `"1tB"` -> `1TB` -- `"5 peta"` -> `5PB` -- `"28 kilobytes"` -> `28KB` -- `"1 gigabyte"` -> `1GB` - -#### `-name` - -Specifies the name of the attack to be recorded in responses. - -#### `-output` - -Specifies the output file to which the binary results will be written -to. Made to be piped to the report command input. Defaults to stdout. - -#### `-rate` - -Specifies the request rate per time unit to issue against -the targets. The actual request rate can vary slightly due to things like -garbage collection, but overall it should stay very close to the specified. -If no time unit is provided, 1s is used. - -A `-rate` of `0` or `infinity` means vegeta will send requests as fast as possible. -Use together with `-max-workers` to model a fixed set of concurrent users sending -requests serially (i.e. waiting for a response before sending the next request). - -Setting `-max-workers` to a very high number while setting `-rate=0` can result in -vegeta consuming too many resources and crashing. Use with care. - -#### `-redirects` - -Specifies the max number of redirects followed on each request. The -default is 10. When the value is -1, redirects are not followed but -the response is marked as successful. - -#### `-resolvers` - -Specifies custom DNS resolver addresses to use for name resolution instead of -the ones configured by the operating system. Works only on non Windows systems. - -#### `-root-certs` - -Specifies the trusted TLS root CAs certificate files as a comma separated -list. If unspecified, the default system CAs certificates will be used. - -#### `-targets` - -Specifies the file from which to read targets, defaulting to stdin. -See the [`-format`](#-format) section to learn about the different target formats. - -#### `-timeout` - -Specifies the timeout for each request. The default is 0 which disables -timeouts. - -#### `-workers` - -Specifies the initial number of workers used in the attack. The actual -number of workers will increase if necessary in order to sustain the -requested rate, unless it'd go beyond `-max-workers`. - -#### `-max-workers` - -Specifies the maximum number of workers used in the attack. It can be used to -control the concurrency level used by an attack. - -### `report` command - -```console -Usage: vegeta report [options] [...] - -Outputs a report of attack results. - -Arguments: - A file with vegeta attack results encoded with one of - the supported encodings (gob | json | csv) [default: stdin] - -Options: - --type Which report type to generate (text | json | hist[buckets] | hdrplot). - [default: text] - - --buckets Histogram buckets, e.g.: '[0,1ms,10ms]' - - --every Write the report to --output at every given interval (e.g 100ms) - The default of 0 means the report will only be written after - all results have been processed. [default: 0] - - --output Output file [default: stdout] - -Examples: - echo "GET http://:80" | vegeta attack -rate=10/s > results.gob - echo "GET http://:80" | vegeta attack -rate=100/s | vegeta encode > results.json - vegeta report results.* -``` - -#### `report -type=text` - -```console -Requests [total, rate, throughput] 1200, 120.00, 65.87 -Duration [total, attack, wait] 10.094965987s, 9.949883921s, 145.082066ms -Latencies [mean, 50, 95, 99, max] 113.172398ms, 108.272568ms, 140.18235ms, 247.771566ms, 264.815246ms -Bytes In [total, mean] 3714690, 3095.57 -Bytes Out [total, mean] 0, 0.00 -Success [ratio] 55.42% -Status Codes [code:count] 0:535 200:665 -Error Set: -Get http://localhost:6060: dial tcp 127.0.0.1:6060: connection refused -Get http://localhost:6060: read tcp 127.0.0.1:6060: connection reset by peer -Get http://localhost:6060: dial tcp 127.0.0.1:6060: connection reset by peer -Get http://localhost:6060: write tcp 127.0.0.1:6060: broken pipe -Get http://localhost:6060: net/http: transport closed before response was received -Get http://localhost:6060: http: can't write HTTP request on broken connection -``` - -The `Requests` row shows: - -- The `total` number of issued requests. -- The real request `rate` sustained during the `attack` period. -- The `throughput` of successful requests over the `total` period. - -The `Duration` row shows: - -- The `attack` time taken issuing all requests (`total` - `wait`) -- The `wait` time waiting for the response to the last issued request (`total` - `attack`) -- The `total` time taken in the attack (`attack` + `wait`) - -Latency is the amount of time taken for a response to a request to be read (including the `-max-body` bytes from the response body). - -- `mean` is the [arithmetic mean / average](https://en.wikipedia.org/wiki/Arithmetic_mean) of the latencies of all requests in an attack. -- `50`, `95`, `99` are the 50th, 95th an 99th [percentiles](https://en.wikipedia.org/wiki/Percentile), respectively, of the latencies of all requests in an attack. To understand more about why these are useful, I recommend [this article](https://bravenewgeek.com/everything-you-know-about-latency-is-wrong/) from @tylertreat. -- `max` is the maximum latency of all requests in an attack. - -The `Bytes In` and `Bytes Out` rows shows: - -- The `total` number of bytes sent (out) or received (in) with the request or response bodies. -- The `mean` number of bytes sent (out) or received (in) with the request or response bodies. - -The `Success` ratio shows the percentage of requests whose responses didn't error and had status codes between **200** and **400** (non-inclusive). - -The `Status Codes` row shows a histogram of status codes. `0` status codes mean a request failed to be sent. - -The `Error Set` shows a unique set of errors returned by all issued requests. These include requests that got non-successful response status code. - -#### `report -type=json` - -All duration like fields are in nanoseconds. - -```json -{ - "latencies": { - "total": 237119463, - "mean": 2371194, - "50th": 2854306, - "95th": 3478629, - "99th": 3530000, - "max": 3660505 - }, - "buckets": {"0":9952,"1000000":40,"2000000":6,"3000000":0,"4000000":0,"5000000":2}, - "bytes_in": { - "total": 606700, - "mean": 6067 - }, - "bytes_out": { - "total": 0, - "mean": 0 - }, - "earliest": "2015-09-19T14:45:50.645818631+02:00", - "latest": "2015-09-19T14:45:51.635818575+02:00", - "end": "2015-09-19T14:45:51.639325797+02:00", - "duration": 989999944, - "wait": 3507222, - "requests": 100, - "rate": 101.01010672380401, - "throughput": 101.00012489812, - "success": 1, - "status_codes": { - "200": 100 - }, - "errors": [] -} -``` - -In the `buckets` field, each key is a nanosecond value representing the lower bound of a bucket. -The upper bound is implied by the next higher bucket. -Upper bounds are non-inclusive. -The highest bucket is the overflow bucket; it has no upper bound. -The values are counts of how many requests fell into that particular bucket. -If the `-buckets` parameter is not present, the `buckets` field is omitted. - -#### `report -type=hist` - -Computes and prints a text based histogram for the given buckets. -Each bucket upper bound is non-inclusive. - -```console -cat results.bin | vegeta report -type='hist[0,2ms,4ms,6ms]' -Bucket # % Histogram -[0, 2ms] 6007 32.65% ######################## -[2ms, 4ms] 5505 29.92% ###################### -[4ms, 6ms] 2117 11.51% ######## -[6ms, +Inf] 4771 25.93% ################### -``` - -#### `report -type=hdrplot` - -Writes out results in a format plottable by https://hdrhistogram.github.io/HdrHistogram/plotFiles.html. - -``` -Value(ms) Percentile TotalCount 1/(1-Percentile) -0.076715 0.000000 0 1.000000 -0.439370 0.100000 200 1.111111 -0.480836 0.200000 400 1.250000 -0.495559 0.300000 599 1.428571 -0.505101 0.400000 799 1.666667 -0.513059 0.500000 999 2.000000 -0.516664 0.550000 1099 2.222222 -0.520455 0.600000 1199 2.500000 -0.525008 0.650000 1299 2.857143 -0.530174 0.700000 1399 3.333333 -0.534891 0.750000 1499 4.000000 -0.537572 0.775000 1548 4.444444 -0.540340 0.800000 1598 5.000000 -0.543763 0.825000 1648 5.714286 -0.547164 0.850000 1698 6.666667 -0.551432 0.875000 1748 8.000000 -0.553444 0.887500 1773 8.888889 -0.555774 0.900000 1798 10.000000 -0.558454 0.912500 1823 11.428571 -0.562123 0.925000 1848 13.333333 -0.565563 0.937500 1873 16.000000 -0.567831 0.943750 1886 17.777778 -0.570617 0.950000 1898 20.000000 -0.574522 0.956250 1911 22.857143 -0.579046 0.962500 1923 26.666667 -0.584426 0.968750 1936 32.000000 -0.586695 0.971875 1942 35.555556 -0.590451 0.975000 1948 40.000000 -0.597543 0.978125 1954 45.714286 -0.605637 0.981250 1961 53.333333 -0.613564 0.984375 1967 64.000000 -0.620393 0.985938 1970 71.113640 -0.629121 0.987500 1973 80.000000 -0.638060 0.989062 1976 91.424392 -0.648085 0.990625 1979 106.666667 -0.659689 0.992188 1982 128.008193 -0.665870 0.992969 1984 142.227279 -0.672985 0.993750 1986 160.000000 -0.680101 0.994531 1987 182.848784 -0.687810 0.995313 1989 213.356091 -0.695729 0.996094 1990 256.016385 -0.730641 0.996484 1991 284.414107 -0.785516 0.996875 1992 320.000000 -0.840392 0.997266 1993 365.764448 -1.009646 0.997656 1993 426.621160 -1.347020 0.998047 1994 512.032770 -1.515276 0.998242 1994 568.828214 -1.683532 0.998437 1995 639.795266 -1.887487 0.998633 1995 731.528895 -2.106249 0.998828 1996 853.242321 -2.325011 0.999023 1996 1023.541453 -2.434952 0.999121 1996 1137.656428 -2.544894 0.999219 1996 1280.409731 -2.589510 0.999316 1997 1461.988304 -2.605192 0.999414 1997 1706.484642 -2.620873 0.999512 1997 2049.180328 -2.628713 0.999561 1997 2277.904328 -2.636394 0.999609 1997 2557.544757 -2.644234 0.999658 1997 2923.976608 -2.652075 0.999707 1997 3412.969283 -2.658916 0.999756 1998 4098.360656 -2.658916 0.999780 1998 4545.454545 -2.658916 0.999805 1998 5128.205128 -2.658916 0.999829 1998 5847.953216 -2.658916 0.999854 1998 6849.315068 -2.658916 0.999878 1998 8196.721311 -2.658916 0.999890 1998 9090.909091 -2.658916 0.999902 1998 10204.081633 -2.658916 0.999915 1998 11764.705882 -2.658916 0.999927 1998 13698.630137 -2.658916 0.999939 1998 16393.442623 -2.658916 0.999945 1998 18181.818182 -2.658916 0.999951 1998 20408.163265 -2.658916 0.999957 1998 23255.813953 -2.658916 0.999963 1998 27027.027027 -2.658916 0.999969 1998 32258.064516 -2.658916 0.999973 1998 37037.037037 -2.658916 0.999976 1998 41666.666667 -2.658916 0.999979 1998 47619.047619 -2.658916 0.999982 1998 55555.555556 -2.658916 0.999985 1998 66666.666667 -2.658916 0.999986 1998 71428.571429 -2.658916 0.999988 1998 83333.333333 -2.658916 0.999989 1998 90909.090909 -2.658916 0.999991 1998 111111.111111 -2.658916 0.999992 1998 125000.000000 -2.658916 0.999993 1998 142857.142858 -2.658916 0.999994 1998 166666.666668 -2.658916 0.999995 1998 199999.999999 -2.658916 0.999996 1998 250000.000000 -2.658916 0.999997 1998 333333.333336 -2.658916 0.999998 1998 500000.000013 -2.658916 0.999999 1998 999999.999971 -2.658916 1.000000 1998 10000000.000000 -``` - -### `encode` command - -``` -Usage: vegeta encode [options] [...] - -Encodes vegeta attack results from one encoding to another. -The supported encodings are Gob (binary), CSV and JSON. -Each input file may have a different encoding which is detected -automatically. - -The CSV encoder doesn't write a header. The columns written by it are: - - 1. Unix timestamp in nanoseconds since epoch - 2. HTTP status code - 3. Request latency in nanoseconds - 4. Bytes out - 5. Bytes in - 6. Error - 7. Base64 encoded response body - 8. Attack name - 9. Sequence number of request - -Arguments: - A file with vegeta attack results encoded with one of - the supported encodings (gob | json | csv) [default: stdin] - -Options: - --to Output encoding (gob | json | csv) [default: json] - --output Output file [default: stdout] - -Examples: - echo "GET http://:80" | vegeta attack -rate=1/s > results.gob - cat results.gob | vegeta encode | jq -c 'del(.body)' | vegeta encode -to gob -``` - -### `plot` command - -![Plot](https://i.imgur.com/Jra1sNH.png) - -``` -Usage: vegeta plot [options] [...] - -Outputs an HTML time series plot of request latencies over time. -The X axis represents elapsed time in seconds from the beginning -of the earliest attack in all input files. The Y axis represents -request latency in milliseconds. - -Click and drag to select a region to zoom into. Double click to zoom out. -Choose a different number on the bottom left corner input field -to change the moving average window size (in data points). - -Arguments: - A file output by running vegeta attack [default: stdin] - -Options: - --title Title and header of the resulting HTML page. - [default: Vegeta Plot] - --threshold Threshold of data points to downsample series to. - Series with less than --threshold number of data - points are not downsampled. [default: 4000] - -Examples: - echo "GET http://:80" | vegeta attack -name=50qps -rate=50 -duration=5s > results.50qps.bin - cat results.50qps.bin | vegeta plot > plot.50qps.html - echo "GET http://:80" | vegeta attack -name=100qps -rate=100 -duration=5s > results.100qps.bin - vegeta plot results.50qps.bin results.100qps.bin > plot.html -``` - -## Usage: Generated targets - -Apart from accepting a static list of targets, Vegeta can be used together with another program that generates them in a streaming fashion. Here's an example of that using the `jq` utility that generates targets with an incrementing id in their body. - -```console -jq -ncM 'while(true; .+1) | {method: "POST", url: "http://:6060", body: {id: .} | @base64 }' | \ - vegeta attack -rate=50/s -lazy -format=json -duration=30s | \ - tee results.bin | \ - vegeta report -``` - -## Usage: Distributed attacks - -Whenever your load test can't be conducted due to Vegeta hitting machine limits -such as open files, memory, CPU or network bandwidth, it's a good idea to use Vegeta in a distributed manner. - -In a hypothetical scenario where the desired attack rate is 60k requests per second, -let's assume we have 3 machines with `vegeta` installed. - -Make sure open file descriptor and process limits are set to a high number for your user **on each machine** -using the `ulimit` command. - -We're ready to start the attack. All we need to do is to divide the intended rate by the number of machines, -and use that number on each attack. Here we'll use [pdsh](https://code.google.com/p/pdsh/) for orchestration. - -```shell -$ PDSH_RCMD_TYPE=ssh pdsh -b -w '10.0.1.1,10.0.2.1,10.0.3.1' \ - 'echo "GET http://target/" | vegeta attack -rate=20000 -duration=60s > result.bin' -``` - -After the previous command finishes, we can gather the result files to use on our report. - -```shell -$ for machine in 10.0.1.1 10.0.2.1 10.0.3.1; do - scp $machine:~/result.bin $machine.bin & - done -``` - -The `report` command accepts multiple result files. -It'll read and sort them by timestamp before generating reports. - -```console -vegeta report *.bin -``` - -## Usage: Real-time Analysis - -If you are a happy user of iTerm, you can integrate vegeta with [jplot](https://github.com/rs/jplot) using [jaggr](https://github.com/rs/jaggr) to plot a vegeta report in real-time in the comfort of you terminal: - -``` -echo 'GET http://localhost:8080' | \ - vegeta attack -rate 5000 -duration 10m | vegeta encode | \ - jaggr @count=rps \ - hist\[100,200,300,400,500\]:code \ - p25,p50,p95:latency \ - sum:bytes_in \ - sum:bytes_out | \ - jplot rps+code.hist.100+code.hist.200+code.hist.300+code.hist.400+code.hist.500 \ - latency.p95+latency.p50+latency.p25 \ - bytes_in.sum+bytes_out.sum -``` - -![](https://i.imgur.com/ttBDsQS.gif) - -## Usage (Library) - -The library versioning follows [SemVer v2.0.0](https://semver.org/spec/v2.0.0.html). -Since [lib/v9.0.0](https://github.com/tsenart/vegeta/tree/lib/v9.0.0), the library and cli -are versioned separately to better isolate breaking changes to each component. - -See [Versioning](#Versioning) for more details on git tag naming schemes and compatibility -with `go mod`. - -```go -package main - -import ( - "fmt" - "time" - - vegeta "github.com/tsenart/vegeta/lib" -) - -func main() { - rate := vegeta.Rate{Freq: 100, Per: time.Second} - duration := 4 * time.Second - targeter := vegeta.NewStaticTargeter(vegeta.Target{ - Method: "GET", - URL: "http://localhost:9100/", - }) - attacker := vegeta.NewAttacker() - - var metrics vegeta.Metrics - for res := range attacker.Attack(targeter, rate, duration, "Big Bang!") { - metrics.Add(res) - } - metrics.Close() - - fmt.Printf("99th percentile: %s\n", metrics.Latencies.P99) -} -``` - -#### Limitations - -There will be an upper bound of the supported `rate` which varies on the -machine being used. -You could be CPU bound (unlikely), memory bound (more likely) or -have system resource limits being reached which ought to be tuned for -the process execution. The important limits for us are file descriptors -and processes. On a UNIX system you can get and set the current -soft-limit values for a user. - -```shell -$ ulimit -n # file descriptors -2560 -$ ulimit -u # processes / threads -709 -``` - -Just pass a new number as the argument to change it. - -## License - -See [LICENSE](LICENSE). - -## Donate - -If you use and love Vegeta, please consider sending some Satoshi to -`1MDmKC51ve7Upxt75KoNM6x1qdXHFK6iW2`. In case you want to be mentioned as a -sponsor, let me know! - -[![Donate Bitcoin](https://i.imgur.com/W9Vc51d.png)](#donate) diff --git a/vendor/github.com/tsenart/vegeta/attack.go b/vendor/github.com/tsenart/vegeta/attack.go deleted file mode 100644 index c018a329..00000000 --- a/vendor/github.com/tsenart/vegeta/attack.go +++ /dev/null @@ -1,242 +0,0 @@ -package main - -import ( - "crypto/tls" - "crypto/x509" - "errors" - "flag" - "fmt" - "io" - "io/ioutil" - "net" - "net/http" - "os" - "os/signal" - "strings" - "time" - - "github.com/tsenart/vegeta/internal/resolver" - vegeta "github.com/tsenart/vegeta/lib" -) - -func attackCmd() command { - fs := flag.NewFlagSet("vegeta attack", flag.ExitOnError) - opts := &attackOpts{ - headers: headers{http.Header{}}, - laddr: localAddr{&vegeta.DefaultLocalAddr}, - rate: vegeta.Rate{Freq: 50, Per: time.Second}, - maxBody: vegeta.DefaultMaxBody, - } - fs.StringVar(&opts.name, "name", "", "Attack name") - fs.StringVar(&opts.targetsf, "targets", "stdin", "Targets file") - fs.StringVar(&opts.format, "format", vegeta.HTTPTargetFormat, - fmt.Sprintf("Targets format [%s]", strings.Join(vegeta.TargetFormats, ", "))) - fs.StringVar(&opts.outputf, "output", "stdout", "Output file") - fs.StringVar(&opts.bodyf, "body", "", "Requests body file") - fs.StringVar(&opts.certf, "cert", "", "TLS client PEM encoded certificate file") - fs.StringVar(&opts.keyf, "key", "", "TLS client PEM encoded private key file") - fs.Var(&opts.rootCerts, "root-certs", "TLS root certificate files (comma separated list)") - fs.BoolVar(&opts.http2, "http2", true, "Send HTTP/2 requests when supported by the server") - fs.BoolVar(&opts.h2c, "h2c", false, "Send HTTP/2 requests without TLS encryption") - fs.BoolVar(&opts.insecure, "insecure", false, "Ignore invalid server TLS certificates") - fs.BoolVar(&opts.lazy, "lazy", false, "Read targets lazily") - fs.DurationVar(&opts.duration, "duration", 0, "Duration of the test [0 = forever]") - fs.DurationVar(&opts.timeout, "timeout", vegeta.DefaultTimeout, "Requests timeout") - fs.Uint64Var(&opts.workers, "workers", vegeta.DefaultWorkers, "Initial number of workers") - fs.Uint64Var(&opts.maxWorkers, "max-workers", vegeta.DefaultMaxWorkers, "Maximum number of workers") - fs.IntVar(&opts.connections, "connections", vegeta.DefaultConnections, "Max open idle connections per target host") - fs.IntVar(&opts.redirects, "redirects", vegeta.DefaultRedirects, "Number of redirects to follow. -1 will not follow but marks as success") - fs.Var(&maxBodyFlag{&opts.maxBody}, "max-body", "Maximum number of bytes to capture from response bodies. [-1 = no limit]") - fs.Var(&rateFlag{&opts.rate}, "rate", "Number of requests per time unit [0 = infinity]") - fs.Var(&opts.headers, "header", "Request header") - fs.Var(&opts.laddr, "laddr", "Local IP address") - fs.BoolVar(&opts.keepalive, "keepalive", true, "Use persistent connections") - fs.StringVar(&opts.unixSocket, "unix-socket", "", "Connect over a unix socket. This overrides the host address in target URLs") - systemSpecificFlags(fs, opts) - - return command{fs, func(args []string) error { - fs.Parse(args) - return attack(opts) - }} -} - -var ( - errZeroRate = errors.New("rate frequency and time unit must be bigger than zero") - errBadCert = errors.New("bad certificate") -) - -// attackOpts aggregates the attack function command options -type attackOpts struct { - name string - targetsf string - format string - outputf string - bodyf string - certf string - keyf string - rootCerts csl - http2 bool - h2c bool - insecure bool - lazy bool - duration time.Duration - timeout time.Duration - rate vegeta.Rate - workers uint64 - maxWorkers uint64 - connections int - redirects int - maxBody int64 - headers headers - laddr localAddr - keepalive bool - resolvers csl - unixSocket string -} - -// attack validates the attack arguments, sets up the -// required resources, launches the attack and writes the results -func attack(opts *attackOpts) (err error) { - if opts.maxWorkers == vegeta.DefaultMaxWorkers && opts.rate.Freq == 0 { - return fmt.Errorf("-rate=0 requires setting -max-workers") - } - - if len(opts.resolvers) > 0 { - res, err := resolver.NewResolver(opts.resolvers) - if err != nil { - return err - } - net.DefaultResolver = res - } - - files := map[string]io.Reader{} - for _, filename := range []string{opts.targetsf, opts.bodyf} { - if filename == "" { - continue - } - f, err := file(filename, false) - if err != nil { - return fmt.Errorf("error opening %s: %s", filename, err) - } - defer f.Close() - files[filename] = f - } - - var body []byte - if bodyf, ok := files[opts.bodyf]; ok { - if body, err = ioutil.ReadAll(bodyf); err != nil { - return fmt.Errorf("error reading %s: %s", opts.bodyf, err) - } - } - - var ( - tr vegeta.Targeter - src = files[opts.targetsf] - hdr = opts.headers.Header - ) - - switch opts.format { - case vegeta.JSONTargetFormat: - tr = vegeta.NewJSONTargeter(src, body, hdr) - case vegeta.HTTPTargetFormat: - tr = vegeta.NewHTTPTargeter(src, body, hdr) - default: - return fmt.Errorf("format %q isn't one of [%s]", - opts.format, strings.Join(vegeta.TargetFormats, ", ")) - } - - if !opts.lazy { - targets, err := vegeta.ReadAllTargets(tr) - if err != nil { - return err - } - tr = vegeta.NewStaticTargeter(targets...) - } - - out, err := file(opts.outputf, true) - if err != nil { - return fmt.Errorf("error opening %s: %s", opts.outputf, err) - } - defer out.Close() - - tlsc, err := tlsConfig(opts.insecure, opts.certf, opts.keyf, opts.rootCerts) - if err != nil { - return err - } - - atk := vegeta.NewAttacker( - vegeta.Redirects(opts.redirects), - vegeta.Timeout(opts.timeout), - vegeta.LocalAddr(*opts.laddr.IPAddr), - vegeta.TLSConfig(tlsc), - vegeta.Workers(opts.workers), - vegeta.MaxWorkers(opts.maxWorkers), - vegeta.KeepAlive(opts.keepalive), - vegeta.Connections(opts.connections), - vegeta.HTTP2(opts.http2), - vegeta.H2C(opts.h2c), - vegeta.MaxBody(opts.maxBody), - vegeta.UnixSocket(opts.unixSocket), - ) - - res := atk.Attack(tr, opts.rate, opts.duration, opts.name) - enc := vegeta.NewEncoder(out) - sig := make(chan os.Signal, 1) - signal.Notify(sig, os.Interrupt) - - for { - select { - case <-sig: - atk.Stop() - return nil - case r, ok := <-res: - if !ok { - return nil - } - if err = enc.Encode(r); err != nil { - return err - } - } - } -} - -// tlsConfig builds a *tls.Config from the given options. -func tlsConfig(insecure bool, certf, keyf string, rootCerts []string) (*tls.Config, error) { - var err error - files := map[string][]byte{} - filenames := append([]string{certf, keyf}, rootCerts...) - for _, f := range filenames { - if f != "" { - if files[f], err = ioutil.ReadFile(f); err != nil { - return nil, err - } - } - } - - c := tls.Config{InsecureSkipVerify: insecure} - if cert, ok := files[certf]; ok { - key, ok := files[keyf] - if !ok { - key = cert - } - - certificate, err := tls.X509KeyPair(cert, key) - if err != nil { - return nil, err - } - - c.Certificates = append(c.Certificates, certificate) - c.BuildNameToCertificate() - } - - if len(rootCerts) > 0 { - c.RootCAs = x509.NewCertPool() - for _, f := range rootCerts { - if !c.RootCAs.AppendCertsFromPEM(files[f]) { - return nil, errBadCert - } - } - } - - return &c, nil -} diff --git a/vendor/github.com/tsenart/vegeta/attack_nonwindows.go b/vendor/github.com/tsenart/vegeta/attack_nonwindows.go deleted file mode 100644 index ad6d6a92..00000000 --- a/vendor/github.com/tsenart/vegeta/attack_nonwindows.go +++ /dev/null @@ -1,9 +0,0 @@ -// +build !windows - -package main - -import "flag" - -func systemSpecificFlags(fs *flag.FlagSet, opts *attackOpts) { - fs.Var(&opts.resolvers, "resolvers", "List of addresses (ip:port) to use for DNS resolution. Disables use of local system DNS. (comma separated list)") -} diff --git a/vendor/github.com/tsenart/vegeta/attack_windows.go b/vendor/github.com/tsenart/vegeta/attack_windows.go deleted file mode 100644 index 1fcc62ba..00000000 --- a/vendor/github.com/tsenart/vegeta/attack_windows.go +++ /dev/null @@ -1,5 +0,0 @@ -package main - -import "flag" - -func systemSpecificFlags(fs *flag.FlagSet, opts *attackOpts) {} diff --git a/vendor/github.com/tsenart/vegeta/dump.go b/vendor/github.com/tsenart/vegeta/dump.go deleted file mode 100644 index 2f03b559..00000000 --- a/vendor/github.com/tsenart/vegeta/dump.go +++ /dev/null @@ -1,11 +0,0 @@ -package main - -import ( - "fmt" -) - -func dumpCmd() command { - return command{fn: func([]string) error { - return fmt.Errorf("vegeta dump has been deprecated and succeeded by the vegeta encode command") - }} -} diff --git a/vendor/github.com/tsenart/vegeta/encode.go b/vendor/github.com/tsenart/vegeta/encode.go deleted file mode 100644 index e3997f5c..00000000 --- a/vendor/github.com/tsenart/vegeta/encode.go +++ /dev/null @@ -1,119 +0,0 @@ -package main - -import ( - "flag" - "fmt" - "io" - "os" - "os/signal" - "strings" - - vegeta "github.com/tsenart/vegeta/lib" -) - -const ( - encodingCSV = "csv" - encodingGob = "gob" - encodingJSON = "json" -) - -const encodeUsage = `Usage: vegeta encode [options] [...] - -Encodes vegeta attack results from one encoding to another. -The supported encodings are Gob (binary), CSV and JSON. -Each input file may have a different encoding which is detected -automatically. - -The CSV encoder doesn't write a header. The columns written by it are: - - 1. Unix timestamp in nanoseconds since epoch - 2. HTTP status code - 3. Request latency in nanoseconds - 4. Bytes out - 5. Bytes in - 6. Error - 7. Base64 encoded response body - 8. Attack name - 9. Sequence number of request - -Arguments: - A file with vegeta attack results encoded with one of - the supported encodings (gob | json | csv) [default: stdin] - -Options: - --to Output encoding (gob | json | csv) [default: json] - --output Output file [default: stdout] - -Examples: - echo "GET http://:80" | vegeta attack -rate=1/s > results.gob - cat results.gob | vegeta encode | jq -c 'del(.body)' | vegeta encode -to gob -` - -func encodeCmd() command { - encs := "[" + strings.Join([]string{encodingCSV, encodingGob, encodingJSON}, ", ") + "]" - fs := flag.NewFlagSet("vegeta encode", flag.ExitOnError) - to := fs.String("to", encodingJSON, "Output encoding "+encs) - output := fs.String("output", "stdout", "Output file") - - fs.Usage = func() { - fmt.Fprintln(os.Stderr, encodeUsage) - } - - return command{fs, func(args []string) error { - fs.Parse(args) - files := fs.Args() - if len(files) == 0 { - files = append(files, "stdin") - } - return encode(files, *to, *output) - }} -} - -func encode(files []string, to, output string) error { - dec, mc, err := decoder(files) - defer mc.Close() - if err != nil { - return err - } - - out, err := file(output, true) - if err != nil { - return err - } - defer out.Close() - - var enc vegeta.Encoder - switch to { - case encodingCSV: - enc = vegeta.NewCSVEncoder(out) - case encodingGob: - enc = vegeta.NewEncoder(out) - case encodingJSON: - enc = vegeta.NewJSONEncoder(out) - default: - return fmt.Errorf("encode: unknown encoding %q", to) - } - - sigch := make(chan os.Signal, 1) - signal.Notify(sigch, os.Interrupt) - - for { - select { - case <-sigch: - return nil - default: - } - - var r vegeta.Result - if err = dec.Decode(&r); err != nil { - if err == io.EOF { - break - } - return err - } else if err = enc.Encode(&r); err != nil { - return err - } - } - - return nil -} diff --git a/vendor/github.com/tsenart/vegeta/file.go b/vendor/github.com/tsenart/vegeta/file.go deleted file mode 100644 index 9e547f16..00000000 --- a/vendor/github.com/tsenart/vegeta/file.go +++ /dev/null @@ -1,62 +0,0 @@ -package main - -import ( - "errors" - "fmt" - "io" - "os" - "strings" - - vegeta "github.com/tsenart/vegeta/lib" -) - -func file(name string, create bool) (*os.File, error) { - switch name { - case "stdin": - return os.Stdin, nil - case "stdout": - return os.Stdout, nil - default: - if create { - return os.Create(name) - } - return os.Open(name) - } -} - -func decoder(files []string) (vegeta.Decoder, io.Closer, error) { - closer := make(multiCloser, 0, len(files)) - decs := make([]vegeta.Decoder, 0, len(files)) - for _, f := range files { - rc, err := file(f, false) - if err != nil { - return nil, closer, err - } - - dec := vegeta.DecoderFor(rc) - if dec == nil { - return nil, closer, fmt.Errorf("encode: can't detect encoding of %q", f) - } - - decs = append(decs, dec) - closer = append(closer, rc) - } - return vegeta.NewRoundRobinDecoder(decs...), closer, nil -} - -type multiCloser []io.Closer - -func (mc multiCloser) Close() error { - var errs []string - for _, c := range mc { - if err := c.Close(); err != nil { - errs = append(errs, err.Error()) - } - } - - if len(errs) > 0 { - return errors.New(strings.Join(errs, "; ")) - } - - return nil -} diff --git a/vendor/github.com/tsenart/vegeta/flags.go b/vendor/github.com/tsenart/vegeta/flags.go deleted file mode 100644 index b9c20606..00000000 --- a/vendor/github.com/tsenart/vegeta/flags.go +++ /dev/null @@ -1,134 +0,0 @@ -package main - -import ( - "bytes" - "fmt" - "math" - "net" - "net/http" - "strconv" - "strings" - "time" - - "github.com/c2h5oh/datasize" - vegeta "github.com/tsenart/vegeta/lib" -) - -// headers is the http.Header used in each target request -// it is defined here to implement the flag.Value interface -// in order to support multiple identical flags for request header -// specification -type headers struct{ http.Header } - -func (h headers) String() string { - buf := &bytes.Buffer{} - if err := h.Write(buf); err != nil { - return "" - } - return buf.String() -} - -// Set implements the flag.Value interface for a map of HTTP Headers. -func (h headers) Set(value string) error { - parts := strings.SplitN(value, ":", 2) - if len(parts) != 2 { - return fmt.Errorf("header '%s' has a wrong format", value) - } - key, val := strings.TrimSpace(parts[0]), strings.TrimSpace(parts[1]) - if key == "" || val == "" { - return fmt.Errorf("header '%s' has a wrong format", value) - } - // Add key/value directly to the http.Header (map[string][]string). - // http.Header.Add() canonicalizes keys but vegeta is used - // to test systems that require case-sensitive headers. - h.Header[key] = append(h.Header[key], val) - return nil -} - -// localAddr implements the Flag interface for parsing net.IPAddr -type localAddr struct{ *net.IPAddr } - -func (ip *localAddr) Set(value string) (err error) { - ip.IPAddr, err = net.ResolveIPAddr("ip", value) - return -} - -// csl implements the flag.Value interface for comma separated lists -type csl []string - -func (l *csl) Set(v string) error { - *l = strings.Split(v, ",") - return nil -} - -func (l csl) String() string { return strings.Join(l, ",") } - -type rateFlag struct{ *vegeta.Rate } - -func (f *rateFlag) Set(v string) (err error) { - if v == "infinity" { - return nil - } - - ps := strings.SplitN(v, "/", 2) - switch len(ps) { - case 1: - ps = append(ps, "1s") - case 0: - return fmt.Errorf("-rate format %q doesn't match the \"freq/duration\" format (i.e. 50/1s)", v) - } - - f.Freq, err = strconv.Atoi(ps[0]) - if err != nil { - return err - } - - if f.Freq == 0 { - return nil - } - - switch ps[1] { - case "ns", "us", "µs", "ms", "s", "m", "h": - ps[1] = "1" + ps[1] - } - - f.Per, err = time.ParseDuration(ps[1]) - return err -} - -func (f *rateFlag) String() string { - if f.Rate == nil { - return "" - } - return fmt.Sprintf("%d/%s", f.Freq, f.Per) -} - -type maxBodyFlag struct{ n *int64 } - -func (f *maxBodyFlag) Set(v string) (err error) { - if v == "-1" { - *(f.n) = -1 - return nil - } - - var ds datasize.ByteSize - if err = ds.UnmarshalText([]byte(v)); err != nil { - return err - } - - if ds > math.MaxInt64 { - return fmt.Errorf("-max-body=%d overflows int64", ds) - } - - *(f.n) = int64(ds) - return nil -} - -func (f *maxBodyFlag) String() string { - if f.n == nil { - return "" - } else if *(f.n) == -1 { - return "-1" - } - return datasize.ByteSize(*(f.n)).String() -} diff --git a/vendor/github.com/tsenart/vegeta/internal/resolver/resolver.go b/vendor/github.com/tsenart/vegeta/internal/resolver/resolver.go deleted file mode 100644 index 3fc5db4e..00000000 --- a/vendor/github.com/tsenart/vegeta/internal/resolver/resolver.go +++ /dev/null @@ -1,78 +0,0 @@ -package resolver - -import ( - "context" - "errors" - "fmt" - "net" - "strconv" - "strings" - "sync/atomic" -) - -type resolver struct { - addrs []string - dialer *net.Dialer - idx uint64 -} - -// NewResolver - create a new instance of a dns resolver for plugging -// into net.DefaultResolver. Addresses should be a list of -// ip addrs and optional port numbers, separated by colon. -// For example: 1.2.3.4:53 and 1.2.3.4 are both valid. In the absence -// of a port number, 53 will be used instead. -func NewResolver(addrs []string) (*net.Resolver, error) { - if len(addrs) == 0 { - return nil, errors.New("must specify at least resolver address") - } - cleanAddrs, err := normalizeAddrs(addrs) - if err != nil { - return nil, err - } - return &net.Resolver{ - PreferGo: true, - Dial: (&resolver{addrs: cleanAddrs, dialer: &net.Dialer{}}).dial, - }, nil -} - -func normalizeAddrs(addrs []string) ([]string, error) { - normal := make([]string, len(addrs)) - for i, addr := range addrs { - - // if addr has no port, give it 53 - if !strings.Contains(addr, ":") { - addr += ":53" - } - - // validate addr is a valid host:port - host, portstr, err := net.SplitHostPort(addr) - if err != nil { - return nil, err - } - - // validate valid port. - _, err = strconv.ParseUint(portstr, 10, 16) - if err != nil { - return nil, err - } - - // make sure host is an ip. - ip := net.ParseIP(host) - if ip == nil { - return nil, fmt.Errorf("host %s is not an IP address", host) - } - - normal[i] = addr - } - return normal, nil -} - -// ignore the third parameter, as this represents the dns server address that -// we are overriding. -func (r *resolver) dial(ctx context.Context, network, _ string) (net.Conn, error) { - return r.dialer.DialContext(ctx, network, r.address()) -} - -func (r *resolver) address() string { - return r.addrs[atomic.AddUint64(&r.idx, 1)%uint64(len(r.addrs))] -} diff --git a/vendor/github.com/tsenart/vegeta/lib/attack.go b/vendor/github.com/tsenart/vegeta/lib/attack.go deleted file mode 100644 index 51c4957d..00000000 --- a/vendor/github.com/tsenart/vegeta/lib/attack.go +++ /dev/null @@ -1,372 +0,0 @@ -package vegeta - -import ( - "context" - "crypto/tls" - "fmt" - "io" - "io/ioutil" - "math" - "net" - "net/http" - "net/url" - "sync" - "time" - - "golang.org/x/net/http2" -) - -// Attacker is an attack executor which wraps an http.Client -type Attacker struct { - dialer *net.Dialer - client http.Client - stopch chan struct{} - workers uint64 - maxWorkers uint64 - maxBody int64 - redirects int - seqmu sync.Mutex - seq uint64 - began time.Time -} - -const ( - // DefaultRedirects is the default number of times an Attacker follows - // redirects. - DefaultRedirects = 10 - // DefaultTimeout is the default amount of time an Attacker waits for a request - // before it times out. - DefaultTimeout = 30 * time.Second - // DefaultConnections is the default amount of max open idle connections per - // target host. - DefaultConnections = 10000 - // DefaultWorkers is the default initial number of workers used to carry an attack. - DefaultWorkers = 10 - // DefaultMaxWorkers is the default maximum number of workers used to carry an attack. - DefaultMaxWorkers = math.MaxUint64 - // DefaultMaxBody is the default max number of bytes to be read from response bodies. - // Defaults to no limit. - DefaultMaxBody = int64(-1) - // NoFollow is the value when redirects are not followed but marked successful - NoFollow = -1 -) - -var ( - // DefaultLocalAddr is the default local IP address an Attacker uses. - DefaultLocalAddr = net.IPAddr{IP: net.IPv4zero} - // DefaultTLSConfig is the default tls.Config an Attacker uses. - DefaultTLSConfig = &tls.Config{InsecureSkipVerify: true} -) - -// NewAttacker returns a new Attacker with default options which are overridden -// by the optionally provided opts. -func NewAttacker(opts ...func(*Attacker)) *Attacker { - a := &Attacker{ - stopch: make(chan struct{}), - workers: DefaultWorkers, - maxWorkers: DefaultMaxWorkers, - maxBody: DefaultMaxBody, - began: time.Now(), - } - - a.dialer = &net.Dialer{ - LocalAddr: &net.TCPAddr{IP: DefaultLocalAddr.IP, Zone: DefaultLocalAddr.Zone}, - KeepAlive: 30 * time.Second, - } - - a.client = http.Client{ - Timeout: DefaultTimeout, - Transport: &http.Transport{ - Proxy: http.ProxyFromEnvironment, - Dial: a.dialer.Dial, - TLSClientConfig: DefaultTLSConfig, - MaxIdleConnsPerHost: DefaultConnections, - }, - } - - for _, opt := range opts { - opt(a) - } - - return a -} - -// Workers returns a functional option which sets the initial number of workers -// an Attacker uses to hit its targets. More workers may be spawned dynamically -// to sustain the requested rate in the face of slow responses and errors. -func Workers(n uint64) func(*Attacker) { - return func(a *Attacker) { a.workers = n } -} - -// MaxWorkers returns a functional option which sets the maximum number of workers -// an Attacker can use to hit its targets. -func MaxWorkers(n uint64) func(*Attacker) { - return func(a *Attacker) { a.maxWorkers = n } -} - -// Connections returns a functional option which sets the number of maximum idle -// open connections per target host. -func Connections(n int) func(*Attacker) { - return func(a *Attacker) { - tr := a.client.Transport.(*http.Transport) - tr.MaxIdleConnsPerHost = n - } -} - -// Redirects returns a functional option which sets the maximum -// number of redirects an Attacker will follow. -func Redirects(n int) func(*Attacker) { - return func(a *Attacker) { - a.redirects = n - a.client.CheckRedirect = func(_ *http.Request, via []*http.Request) error { - switch { - case n == NoFollow: - return http.ErrUseLastResponse - case n < len(via): - return fmt.Errorf("stopped after %d redirects", n) - default: - return nil - } - } - } -} - -// Proxy returns a functional option which sets the `Proxy` field on -// the http.Client's Transport -func Proxy(proxy func(*http.Request) (*url.URL, error)) func(*Attacker) { - return func(a *Attacker) { - tr := a.client.Transport.(*http.Transport) - tr.Proxy = proxy - } -} - -// Timeout returns a functional option which sets the maximum amount of time -// an Attacker will wait for a request to be responded to and completely read. -func Timeout(d time.Duration) func(*Attacker) { - return func(a *Attacker) { - a.client.Timeout = d - } -} - -// LocalAddr returns a functional option which sets the local address -// an Attacker will use with its requests. -func LocalAddr(addr net.IPAddr) func(*Attacker) { - return func(a *Attacker) { - tr := a.client.Transport.(*http.Transport) - a.dialer.LocalAddr = &net.TCPAddr{IP: addr.IP, Zone: addr.Zone} - tr.Dial = a.dialer.Dial - } -} - -// KeepAlive returns a functional option which toggles KeepAlive -// connections on the dialer and transport. -func KeepAlive(keepalive bool) func(*Attacker) { - return func(a *Attacker) { - tr := a.client.Transport.(*http.Transport) - tr.DisableKeepAlives = !keepalive - if !keepalive { - a.dialer.KeepAlive = 0 - tr.Dial = a.dialer.Dial - } - } -} - -// TLSConfig returns a functional option which sets the *tls.Config for a -// Attacker to use with its requests. -func TLSConfig(c *tls.Config) func(*Attacker) { - return func(a *Attacker) { - tr := a.client.Transport.(*http.Transport) - tr.TLSClientConfig = c - } -} - -// HTTP2 returns a functional option which enables or disables HTTP/2 support -// on requests performed by an Attacker. -func HTTP2(enabled bool) func(*Attacker) { - return func(a *Attacker) { - if tr := a.client.Transport.(*http.Transport); enabled { - http2.ConfigureTransport(tr) - } else { - tr.TLSNextProto = map[string]func(string, *tls.Conn) http.RoundTripper{} - } - } -} - -// H2C returns a functional option which enables H2C support on requests -// performed by an Attacker -func H2C(enabled bool) func(*Attacker) { - return func(a *Attacker) { - if tr := a.client.Transport.(*http.Transport); enabled { - a.client.Transport = &http2.Transport{ - AllowHTTP: true, - DialTLS: func(network, addr string, cfg *tls.Config) (net.Conn, error) { - return tr.Dial(network, addr) - }, - } - } - } -} - -// MaxBody returns a functional option which limits the max number of bytes -// read from response bodies. Set to -1 to disable any limits. -func MaxBody(n int64) func(*Attacker) { - return func(a *Attacker) { a.maxBody = n } -} - -// UnixSocket changes the dialer for the attacker to use the specified unix socket file -func UnixSocket(socket string) func(*Attacker) { - return func(a *Attacker) { - if tr, ok := a.client.Transport.(*http.Transport); socket != "" && ok { - tr.DialContext = func(_ context.Context, _, _ string) (net.Conn, error) { - return net.Dial("unix", socket) - } - } - } -} - -// Client returns a functional option that allows you to bring your own http.Client -func Client(c *http.Client) func(*Attacker) { - return func(a *Attacker) { a.client = *c } -} - -// Attack reads its Targets from the passed Targeter and attacks them at -// the rate specified by the Pacer. When the duration is zero the attack -// runs until Stop is called. Results are sent to the returned channel as soon -// as they arrive and will have their Attack field set to the given name. -func (a *Attacker) Attack(tr Targeter, p Pacer, du time.Duration, name string) <-chan *Result { - var wg sync.WaitGroup - - workers := a.workers - if workers > a.maxWorkers { - workers = a.maxWorkers - } - - results := make(chan *Result) - ticks := make(chan struct{}) - for i := uint64(0); i < workers; i++ { - wg.Add(1) - go a.attack(tr, name, &wg, ticks, results) - } - - go func() { - defer close(results) - defer wg.Wait() - defer close(ticks) - - began, count := time.Now(), uint64(0) - for { - elapsed := time.Since(began) - if du > 0 && elapsed > du { - return - } - - wait, stop := p.Pace(elapsed, count) - if stop { - return - } - - time.Sleep(wait) - - if workers < a.maxWorkers { - select { - case ticks <- struct{}{}: - count++ - continue - case <-a.stopch: - return - default: - // all workers are blocked. start one more and try again - workers++ - wg.Add(1) - go a.attack(tr, name, &wg, ticks, results) - } - } - - select { - case ticks <- struct{}{}: - count++ - case <-a.stopch: - return - } - } - }() - - return results -} - -// Stop stops the current attack. -func (a *Attacker) Stop() { - select { - case <-a.stopch: - return - default: - close(a.stopch) - } -} - -func (a *Attacker) attack(tr Targeter, name string, workers *sync.WaitGroup, ticks <-chan struct{}, results chan<- *Result) { - defer workers.Done() - for range ticks { - results <- a.hit(tr, name) - } -} - -func (a *Attacker) hit(tr Targeter, name string) *Result { - var ( - res = Result{Attack: name} - tgt Target - err error - ) - - a.seqmu.Lock() - res.Timestamp = a.began.Add(time.Since(a.began)) - res.Seq = a.seq - a.seq++ - a.seqmu.Unlock() - - defer func() { - res.Latency = time.Since(res.Timestamp) - if err != nil { - res.Error = err.Error() - } - }() - - if err = tr(&tgt); err != nil { - a.Stop() - return &res - } - - req, err := tgt.Request() - if err != nil { - return &res - } - - r, err := a.client.Do(req) - if err != nil { - return &res - } - defer r.Body.Close() - - body := io.Reader(r.Body) - if a.maxBody >= 0 { - body = io.LimitReader(r.Body, a.maxBody) - } - - if res.Body, err = ioutil.ReadAll(body); err != nil { - return &res - } else if _, err = io.Copy(ioutil.Discard, r.Body); err != nil { - return &res - } - - res.BytesIn = uint64(len(res.Body)) - - if req.ContentLength != -1 { - res.BytesOut = uint64(req.ContentLength) - } - - if res.Code = uint16(r.StatusCode); res.Code < 200 || res.Code >= 400 { - res.Error = r.Status - } - - return &res -} diff --git a/vendor/github.com/tsenart/vegeta/lib/histogram.go b/vendor/github.com/tsenart/vegeta/lib/histogram.go deleted file mode 100644 index f8fd8446..00000000 --- a/vendor/github.com/tsenart/vegeta/lib/histogram.go +++ /dev/null @@ -1,82 +0,0 @@ -package vegeta - -import ( - "bytes" - "fmt" - "strings" - "time" -) - -// Buckets represents an Histogram's latency buckets. -type Buckets []time.Duration - -// Histogram is a bucketed latency Histogram. -type Histogram struct { - Buckets Buckets - Counts []uint64 - Total uint64 -} - -// Add implements the Add method of the Report interface by finding the right -// Bucket for the given Result latency and increasing its count by one as well -// as the total count. -func (h *Histogram) Add(r *Result) { - if len(h.Counts) != len(h.Buckets) { - h.Counts = make([]uint64, len(h.Buckets)) - } - - var i int - for ; i < len(h.Buckets)-1; i++ { - if r.Latency >= h.Buckets[i] && r.Latency < h.Buckets[i+1] { - break - } - } - - h.Total++ - h.Counts[i]++ -} - -// MarshalJSON returns a JSON encoding of the buckets and their counts. -func (h *Histogram) MarshalJSON() ([]byte, error) { - var buf bytes.Buffer - - // Custom marshalling to guarantee order. - buf.WriteString("{") - for i := range h.Buckets { - if i > 0 { - buf.WriteString(", ") - } - if _, err := fmt.Fprintf(&buf, "\"%d\": %d", h.Buckets[i], h.Counts[i]); err != nil { - return nil, err - } - } - buf.WriteString("}") - - return buf.Bytes(), nil -} - -// Nth returns the nth bucket represented as a string. -func (bs Buckets) Nth(i int) (left, right string) { - if i >= len(bs)-1 { - return bs[i].String(), "+Inf" - } - return bs[i].String(), bs[i+1].String() -} - -// UnmarshalText implements the encoding.TextUnmarshaler interface. -func (bs *Buckets) UnmarshalText(value []byte) error { - if len(value) < 2 || value[0] != '[' || value[len(value)-1] != ']' { - return fmt.Errorf("bad buckets: %s", value) - } - for _, v := range strings.Split(string(value[1:len(value)-1]), ",") { - d, err := time.ParseDuration(strings.TrimSpace(v)) - if err != nil { - return err - } - *bs = append(*bs, d) - } - if len(*bs) == 0 { - return fmt.Errorf("bad buckets: %s", value) - } - return nil -} diff --git a/vendor/github.com/tsenart/vegeta/lib/lttb/lttb.go b/vendor/github.com/tsenart/vegeta/lib/lttb/lttb.go deleted file mode 100644 index ecde45de..00000000 --- a/vendor/github.com/tsenart/vegeta/lib/lttb/lttb.go +++ /dev/null @@ -1,96 +0,0 @@ -package lttb - -import "errors" - -// A Point in a line chart. -type Point struct{ X, Y float64 } - -// An Iter is an iterator function that returns -// count number of Points or an error. -type Iter func(count int) ([]Point, error) - -// Downsample `count` number of data points retrieved from the given iterator -// function to contain only `threshold` number of points while maintaining close -// visual similarity to the original data. The algorithm is called -// Largest-Triangle-Three-Buckets and is described in: -// https://skemman.is/bitstream/1946/15343/3/SS_MSthesis.pdf -// -// This implementation grew out of https://github.com/dgryski/go-lttb -// to limit memory usage by leveraging iterators. -func Downsample(count, threshold int, it Iter) ([]Point, error) { - if threshold >= count || threshold == 0 { - points, err := it(count) - return points, err - } - - if threshold < 3 { - return nil, errors.New("lttb: min threshold is 3") - } - - // Bucket size. Leave room for start and end data points - size := float64(count-2) / float64(threshold-2) - - // Get the first point and the current bucket. - points, err := it(int(1 + size)) - if err != nil { - return nil, err - } - - samples := make([]Point, 0, threshold) - samples = append(samples, points[0]) // Always add the first point - current := points[1:] - - for i := 0; i < threshold-2; i++ { - // Calculate bucket boundaries (non inclusive hi) - lo := int(float64(i+1)*size) + 1 - hi := int(float64(i+2)*size) + 1 - - next, err := it(hi - lo) - if err != nil { - return nil, err - } - - samples = append(samples, sample(samples[len(samples)-1], current, next)) - current = next - } - - // Always add the last point unmodified - if points, err = it(count - len(samples)); err != nil { - return nil, err - } else if len(points) == 0 { - points = current - } - - if len(points) > 0 { - samples = append(samples, points[len(points)-1]) - } - - return samples, nil -} - -func sample(a Point, current, next []Point) (b Point) { - // Calculate point c as the average point of all points in the next bucket. - var c Point - for i := range next { - c.X, c.Y = c.X+next[i].X, c.Y+next[i].Y - } - - length := float64(len(next)) - c.X, c.Y = c.X/length, c.Y/length - - // Find index of point b that together with points a and c forms the largest triangle - // amongst all points in the current bucket. - var largest float64 - var index int - for i, p := range current { - // Calculate triangle area over three buckets - area := (a.X-c.X)*(p.Y-a.Y) - (a.X-p.X)*(c.Y-a.Y) - - // We only care about the relative area here. Calling math.Abs() is slower than squaring. - if area *= area; area > largest { - largest, index = area, i - } - } - - return current[index] -} diff --git a/vendor/github.com/tsenart/vegeta/lib/metrics.go b/vendor/github.com/tsenart/vegeta/lib/metrics.go deleted file mode 100644 index 5b3cd626..00000000 --- a/vendor/github.com/tsenart/vegeta/lib/metrics.go +++ /dev/null @@ -1,188 +0,0 @@ -package vegeta - -import ( - "strconv" - "time" - - "github.com/influxdata/tdigest" -) - -// Metrics holds metrics computed out of a slice of Results which are used -// in some of the Reporters -type Metrics struct { - // Latencies holds computed request latency metrics. - Latencies LatencyMetrics `json:"latencies"` - // Histogram, only if requested - Histogram *Histogram `json:"buckets,omitempty"` - // BytesIn holds computed incoming byte metrics. - BytesIn ByteMetrics `json:"bytes_in"` - // BytesOut holds computed outgoing byte metrics. - BytesOut ByteMetrics `json:"bytes_out"` - // Earliest is the earliest timestamp in a Result set. - Earliest time.Time `json:"earliest"` - // Latest is the latest timestamp in a Result set. - Latest time.Time `json:"latest"` - // End is the latest timestamp in a Result set plus its latency. - End time.Time `json:"end"` - // Duration is the duration of the attack. - Duration time.Duration `json:"duration"` - // Wait is the extra time waiting for responses from targets. - Wait time.Duration `json:"wait"` - // Requests is the total number of requests executed. - Requests uint64 `json:"requests"` - // Rate is the rate of sent requests per second. - Rate float64 `json:"rate"` - // Throughput is the rate of successful requests per second. - Throughput float64 `json:"throughput"` - // Success is the percentage of non-error responses. - Success float64 `json:"success"` - // StatusCodes is a histogram of the responses' status codes. - StatusCodes map[string]int `json:"status_codes"` - // Errors is a set of unique errors returned by the targets during the attack. - Errors []string `json:"errors"` - - errors map[string]struct{} - success uint64 -} - -// Add implements the Add method of the Report interface by adding the given -// Result to Metrics. -func (m *Metrics) Add(r *Result) { - m.init() - - m.Requests++ - m.StatusCodes[strconv.Itoa(int(r.Code))]++ - m.BytesOut.Total += r.BytesOut - m.BytesIn.Total += r.BytesIn - - m.Latencies.Add(r.Latency) - - if m.Earliest.IsZero() || m.Earliest.After(r.Timestamp) { - m.Earliest = r.Timestamp - } - - if r.Timestamp.After(m.Latest) { - m.Latest = r.Timestamp - } - - if end := r.End(); end.After(m.End) { - m.End = end - } - - if r.Code >= 200 && r.Code < 400 { - m.success++ - } - - if r.Error != "" { - if _, ok := m.errors[r.Error]; !ok { - m.errors[r.Error] = struct{}{} - m.Errors = append(m.Errors, r.Error) - } - } - - if m.Histogram != nil { - m.Histogram.Add(r) - } -} - -// Close implements the Close method of the Report interface by computing -// derived summary metrics which don't need to be run on every Add call. -func (m *Metrics) Close() { - m.init() - m.Rate = float64(m.Requests) - m.Throughput = float64(m.success) - m.Duration = m.Latest.Sub(m.Earliest) - m.Wait = m.End.Sub(m.Latest) - if secs := m.Duration.Seconds(); secs > 0 { - m.Rate /= secs - // No need to check for zero because we know m.Duration > 0 - m.Throughput /= (m.Duration + m.Wait).Seconds() - } - - m.BytesIn.Mean = float64(m.BytesIn.Total) / float64(m.Requests) - m.BytesOut.Mean = float64(m.BytesOut.Total) / float64(m.Requests) - m.Success = float64(m.success) / float64(m.Requests) - m.Latencies.Mean = time.Duration(float64(m.Latencies.Total) / float64(m.Requests)) - m.Latencies.P50 = m.Latencies.Quantile(0.50) - m.Latencies.P95 = m.Latencies.Quantile(0.95) - m.Latencies.P99 = m.Latencies.Quantile(0.99) -} - -func (m *Metrics) init() { - if m.StatusCodes == nil { - m.StatusCodes = map[string]int{} - } - - if m.errors == nil { - m.errors = map[string]struct{}{} - } - - if m.Errors == nil { - m.Errors = make([]string, 0) - } -} - -// LatencyMetrics holds computed request latency metrics. -type LatencyMetrics struct { - // Total is the total latency sum of all requests in an attack. - Total time.Duration `json:"total"` - // Mean is the mean request latency. - Mean time.Duration `json:"mean"` - // P50 is the 50th percentile request latency. - P50 time.Duration `json:"50th"` - // P95 is the 95th percentile request latency. - P95 time.Duration `json:"95th"` - // P99 is the 99th percentile request latency. - P99 time.Duration `json:"99th"` - // Max is the maximum observed request latency. - Max time.Duration `json:"max"` - - estimator estimator -} - -// Add adds the given latency to the latency metrics. -func (l *LatencyMetrics) Add(latency time.Duration) { - l.init() - if l.Total += latency; latency > l.Max { - l.Max = latency - } - l.estimator.Add(float64(latency)) -} - -// Quantile returns the nth quantile from the latency summary. -func (l LatencyMetrics) Quantile(nth float64) time.Duration { - l.init() - return time.Duration(l.estimator.Get(nth)) -} - -func (l *LatencyMetrics) init() { - if l.estimator == nil { - // This compression parameter value is the recommended value - // for normal uses as per http://javadox.com/com.tdunning/t-digest/3.0/com/tdunning/math/stats/TDigest.html - l.estimator = newTdigestEstimator(100) - } -} - -// ByteMetrics holds computed byte flow metrics. -type ByteMetrics struct { - // Total is the total number of flowing bytes in an attack. - Total uint64 `json:"total"` - // Mean is the mean number of flowing bytes per hit. - Mean float64 `json:"mean"` -} - -type estimator interface { - Add(sample float64) - Get(quantile float64) float64 -} - -type tdigestEstimator struct{ *tdigest.TDigest } - -func newTdigestEstimator(compression float64) *tdigestEstimator { - return &tdigestEstimator{TDigest: tdigest.NewWithCompression(compression)} -} - -func (e *tdigestEstimator) Add(s float64) { e.TDigest.Add(s, 1) } -func (e *tdigestEstimator) Get(q float64) float64 { - return e.TDigest.Quantile(q) -} diff --git a/vendor/github.com/tsenart/vegeta/lib/pacer.go b/vendor/github.com/tsenart/vegeta/lib/pacer.go deleted file mode 100644 index 97c8310b..00000000 --- a/vendor/github.com/tsenart/vegeta/lib/pacer.go +++ /dev/null @@ -1,279 +0,0 @@ -package vegeta - -import ( - "fmt" - "math" - "time" -) - -// A Pacer defines the rate of hits during an Attack by -// returning the duration an Attacker should wait until -// hitting the next Target. If the second return value -// is true, the attack will terminate. -type Pacer interface { - Pace(elapsed time.Duration, hits uint64) (wait time.Duration, stop bool) -} - -// A PacerFunc is a function adapter type that implements -// the Pacer interface. -type PacerFunc func(time.Duration, uint64) (time.Duration, bool) - -// Pace implements the Pacer interface. -func (pf PacerFunc) Pace(elapsed time.Duration, hits uint64) (time.Duration, bool) { - return pf(elapsed, hits) -} - -// A ConstantPacer defines a constant rate of hits for the target. -type ConstantPacer struct { - Freq int // Frequency (number of occurrences) per ... - Per time.Duration // Time unit, usually 1s -} - -// Rate is a type alias for ConstantPacer for backwards-compatibility. -type Rate = ConstantPacer - -// ConstantPacer satisfies the Pacer interface. -var _ Pacer = ConstantPacer{} - -// String returns a pretty-printed description of the ConstantPacer's behaviour: -// ConstantPacer{Freq: 1, Per: time.Second} => Constant{1 hits/1s} -func (cp ConstantPacer) String() string { - return fmt.Sprintf("Constant{%d hits/%s}", cp.Freq, cp.Per) -} - -// Pace determines the length of time to sleep until the next hit is sent. -func (cp ConstantPacer) Pace(elapsed time.Duration, hits uint64) (time.Duration, bool) { - switch { - case cp.Per == 0 || cp.Freq == 0: - return 0, false // Zero value = infinite rate - case cp.Per < 0 || cp.Freq < 0: - return 0, true - } - - expectedHits := uint64(cp.Freq) * uint64(elapsed/cp.Per) - if hits < expectedHits { - // Running behind, send next hit immediately. - return 0, false - } - interval := uint64(cp.Per.Nanoseconds() / int64(cp.Freq)) - if math.MaxInt64/interval < hits { - // We would overflow delta if we continued, so stop the attack. - return 0, true - } - delta := time.Duration((hits + 1) * interval) - // Zero or negative durations cause time.Sleep to return immediately. - return delta - elapsed, false -} - -// hitsPerNs returns the attack rate this ConstantPacer represents, in -// fractional hits per nanosecond. -func (cp ConstantPacer) hitsPerNs() float64 { - return float64(cp.Freq) / float64(cp.Per) -} - -const ( - // MeanUp is a SinePacer Offset that causes the attack to start - // at the Mean attack rate and increase towards the peak. - MeanUp float64 = 0 - // Peak is a SinePacer Offset that causes the attack to start - // at the peak (maximum) attack rate and decrease towards the Mean. - Peak = math.Pi / 2 - // MeanDown is a SinePacer Offset that causes the attack to start - // at the Mean attack rate and decrease towards the trough. - MeanDown = math.Pi - // Trough is a SinePacer Offset that causes the attack to start - // at the trough (minimum) attack rate and increase towards the Mean. - Trough = 3 * math.Pi / 2 -) - -// SinePacer is a Pacer that describes attack request rates with the equation: -// R = MA sin(O+(2𝛑/P)t) -// Where: -// R = Instantaneous attack rate at elapsed time t, hits per nanosecond -// M = Mean attack rate over period P, sp.Mean, hits per nanosecond -// A = Amplitude of sine wave, sp.Amp, hits per nanosecond -// O = Offset of sine wave, sp.StartAt, radians -// P = Period of sine wave, sp.Period, nanoseconds -// t = Elapsed time since attack start, nanoseconds -// -// Many thanks to http://ascii.co.uk/art/sine and "sps" for the ascii here :-) -// -// Mean -| ,-'''-. -// +Amp | ,-' | `-. -// | ,' | `. O=𝛑 -// | ,' O=𝛑/2 `. MeanDown -// | / Peak \ / -// |/ \ / -// Mean -+-------------------------\--------------------------> t -// |\ \ / -// | \ \ O=3𝛑/2 / -// | O=0 `. Trough ,' -// | MeanUp `. | ,' -// Mean | `-. | ,-' -// -Amp -| `-,,,-' -// |<-------------------- Period --------------------->| -// -// This equation is integrated with respect to time to derive the expected -// number of hits served at time t after the attack began: -// H = Mt - (AP/2𝛑)cos(O+(2𝛑/P)t) + (AP/2𝛑)cos(O) -// Where: -// H = Total number of hits triggered during t -type SinePacer struct { - // The period of the sine wave, e.g. 20*time.Minute - // MUST BE > 0 - Period time.Duration - // The mid-point of the sine wave in freq-per-Duration, - // MUST BE > 0 - Mean Rate - // The amplitude of the sine wave in freq-per-Duration, - // MUST NOT BE EQUAL TO OR LARGER THAN MEAN - Amp Rate - // The offset, in radians, for the sine wave at t=0. - StartAt float64 -} - -// SinePacer satisfies the Pacer interface. -var _ Pacer = SinePacer{} - -// String returns a pretty-printed description of the SinePacer's behaviour: -// SinePacer{ -// Period: time.Hour, -// Mean: Rate{100, time.Second}, -// Amp: Rate{50, time.Second}, -// StartAt: MeanDown, -// } => -// Sine{Constant{100 hits/1s} ± Constant{50 hits/1s} / 1h, offset 1𝛑} -func (sp SinePacer) String() string { - return fmt.Sprintf("Sine{%s ± %s / %s, offset %g𝛑}", sp.Mean, sp.Amp, sp.Period, sp.StartAt/math.Pi) -} - -// invalid tests the constraints documented in the SinePacer struct definition. -func (sp SinePacer) invalid() bool { - return sp.Period <= 0 || sp.Mean.hitsPerNs() <= 0 || sp.Amp.hitsPerNs() >= sp.Mean.hitsPerNs() -} - -// Pace determines the length of time to sleep until the next hit is sent. -func (sp SinePacer) Pace(elapsedTime time.Duration, elapsedHits uint64) (time.Duration, bool) { - if sp.invalid() { - // If the SinePacer configuration is invalid, stop the attack. - return 0, true - } - expectedHits := sp.hits(elapsedTime) - if elapsedHits < uint64(expectedHits) { - // Running behind, send next hit immediately. - return 0, false - } - // Re-arranging our hits equation to provide a duration given the number of - // requests sent is non-trivial, so we must solve for the duration numerically. - // math.Round() added here because we have to coerce to int64 nanoseconds - // at some point and it corrects a bunch of off-by-one problems. - nsPerHit := math.Round(1 / sp.hitsPerNs(elapsedTime)) - hitsToWait := float64(elapsedHits+1) - expectedHits - nextHitIn := time.Duration(nsPerHit * hitsToWait) - - // If we can't converge to an error of <1e-3 within 5 iterations, bail. - // This rarely even loops for any large Period if hitsToWait is small. - for i := 0; i < 5; i++ { - hitsAtGuess := sp.hits(elapsedTime + nextHitIn) - err := float64(elapsedHits+1) - hitsAtGuess - if math.Abs(err) < 1e-3 { - return nextHitIn, false - } - nextHitIn = time.Duration(float64(nextHitIn) / (hitsAtGuess - float64(elapsedHits))) - } - return nextHitIn, false -} - -// ampHits returns AP/2𝛑, which is the number of hits added or subtracted -// from the Mean due to the Amplitude over a quarter of the Period, -// i.e. from 0 → 𝛑/2 radians -func (sp SinePacer) ampHits() float64 { - return (sp.Amp.hitsPerNs() * float64(sp.Period)) / (2 * math.Pi) -} - -// radians converts the elapsed attack time to a radian value. -// The elapsed time t is divided by the wave period, multiplied by 2𝛑 to -// convert to radians, and offset by StartAt radians. -func (sp SinePacer) radians(t time.Duration) float64 { - return sp.StartAt + float64(t)*2*math.Pi/float64(sp.Period) -} - -// hitsPerNs calculates the instantaneous rate of attack at -// t nanoseconds after the attack began. -// R = MA sin(O+(2𝛑/P)t) -func (sp SinePacer) hitsPerNs(t time.Duration) float64 { - return sp.Mean.hitsPerNs() + sp.Amp.hitsPerNs()*math.Sin(sp.radians(t)) -} - -// hits returns the number of hits that have been sent during an attack -// lasting t nanoseconds. It returns a float so we can tell exactly how -// much we've missed our target by when solving numerically in Pace. -// H = Mt - (AP/2𝛑)cos(O+(2𝛑/P)t) + (AP/2𝛑)cos(O) -// This re-arranges to: -// H = Mt + (AP/2𝛑)(cos(O) - cos(O+(2𝛑/P)t)) -func (sp SinePacer) hits(t time.Duration) float64 { - if t <= 0 || sp.invalid() { - return 0 - } - return sp.Mean.hitsPerNs()*float64(t) + sp.ampHits()*(math.Cos(sp.StartAt)-math.Cos(sp.radians(t))) -} - -// LinearPacer paces an attack by starting at a given request rate -// and increasing linearly with the given slope. -type LinearPacer struct { - StartAt Rate - Slope float64 -} - -// Pace determines the length of time to sleep until the next hit is sent. -func (p LinearPacer) Pace(elapsed time.Duration, hits uint64) (time.Duration, bool) { - switch { - case p.StartAt.Per == 0 || p.StartAt.Freq == 0: - return 0, false // Zero value = infinite rate - case p.StartAt.Per < 0 || p.StartAt.Freq < 0: - return 0, true - } - - expectedHits := p.hits(elapsed) - if hits == 0 || hits < uint64(expectedHits) { - // Running behind, send next hit immediately. - return 0, false - } - - rate := p.rate(elapsed) - interval := math.Round(1e9 / rate) - - if n := uint64(interval); n != 0 && math.MaxInt64/n < hits { - // We would overflow wait if we continued, so stop the attack. - return 0, true - } - - delta := float64(hits+1) - expectedHits - wait := time.Duration(interval * delta) - - return wait, false -} - -// hits returns the number of hits that have been sent during an attack -// lasting t nanoseconds. It returns a float so we can tell exactly how -// much we've missed our target by when solving numerically in Pace. -func (p LinearPacer) hits(t time.Duration) float64 { - if t < 0 { - return 0 - } - - a := p.Slope - b := p.StartAt.hitsPerNs() * 1e9 - x := t.Seconds() - - return (a*math.Pow(x, 2))/2 + b*x -} - -// rate calculates the instantaneous rate of attack at -// t nanoseconds after the attack began. -func (p LinearPacer) rate(t time.Duration) float64 { - a := p.Slope - x := t.Seconds() - b := p.StartAt.hitsPerNs() * 1e9 - return a*x + b -} diff --git a/vendor/github.com/tsenart/vegeta/lib/plot/assets.go b/vendor/github.com/tsenart/vegeta/lib/plot/assets.go deleted file mode 100644 index efadc468..00000000 --- a/vendor/github.com/tsenart/vegeta/lib/plot/assets.go +++ /dev/null @@ -1,10 +0,0 @@ -// +build dev - -package plot - -import ( - "net/http" -) - -// Assets contains assets required to render the Plot. -var Assets http.FileSystem = http.Dir("assets") diff --git a/vendor/github.com/tsenart/vegeta/lib/plot/assets_vfsdata.go b/vendor/github.com/tsenart/vegeta/lib/plot/assets_vfsdata.go deleted file mode 100644 index 30dcc031..00000000 --- a/vendor/github.com/tsenart/vegeta/lib/plot/assets_vfsdata.go +++ /dev/null @@ -1,252 +0,0 @@ -// Code generated by vfsgen; DO NOT EDIT. - -// +build !dev - -package plot - -import ( - "bytes" - "compress/gzip" - "fmt" - "io" - "io/ioutil" - "net/http" - "os" - pathpkg "path" - "time" -) - -// Assets statically implements the virtual filesystem provided to vfsgen. -var Assets = func() http.FileSystem { - fs := vfsgen۰FS{ - "/": &vfsgen۰DirInfo{ - name: "/", - modTime: time.Date(2018, 8, 13, 15, 32, 56, 947383985, time.UTC), - }, - "/VERSIONS": &vfsgen۰FileInfo{ - name: "VERSIONS", - modTime: time.Date(2018, 8, 13, 15, 0, 41, 923198933, time.UTC), - content: []byte("\x64\x79\x67\x72\x61\x70\x68\x20\x76\x32\x2e\x31\x2e\x30\x0a\x68\x74\x6d\x6c\x32\x63\x61\x6e\x76\x61\x73\x20\x76\x31\x2e\x30\x2e\x30\x2d\x61\x6c\x70\x68\x61\x2e\x31\x32\x0a"), - }, - "/dygraph.css": &vfsgen۰CompressedFileInfo{ - name: "dygraph.css", - modTime: time.Date(2017, 12, 12, 22, 27, 49, 0, time.UTC), - uncompressedSize: 2642, - - compressedContent: []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xcc\x55\x4d\x8b\x23\x37\x10\xbd\xf7\xaf\x78\x90\x4b\xd2\xac\xdc\x33\x43\xf6\x90\x36\x39\x84\x2c\x21\x81\x40\x02\x09\xe4\xac\x6e\x95\xbb\xc5\xa8\x55\x8d\x54\x1e\xdb\xb3\xec\x7f\x0f\x92\xec\xf5\xc7\x7a\x3c\x13\x48\x20\x47\xab\xbe\xde\x7b\x55\xfd\xdc\xd4\x75\x85\x1a\x1f\x68\xa5\xd7\x4e\x10\x65\xe7\x28\x62\xc5\x01\x32\x12\xcc\x6e\x08\x7a\x1e\x23\xfa\x51\x07\xb1\x7e\x80\xb3\x5d\xd0\x61\xb7\xa8\x50\x37\x55\xb5\xd8\x27\x28\x47\x03\x79\x83\x8f\x15\x30\x73\xb4\x62\xd9\xb7\xd0\x5d\x64\xb7\x16\x5a\x56\xc0\x8a\xbd\xa8\x68\x9f\xa9\xc5\xfd\xb7\xf3\x36\x3d\x3d\x2b\xeb\x0d\x6d\x5b\xdc\xdf\xa5\x9f\x1b\x6b\x64\x6c\xf1\xf0\xfe\x6e\xde\x2e\x81\xa6\x86\xd3\x1d\xb9\xf8\xc1\x3e\xfd\x95\x42\x69\x60\x7a\xae\x70\x84\x65\x48\x28\x4c\xd6\x53\x4c\x70\x23\xa1\xd3\x91\x0c\xd8\x67\xf4\x73\xa0\x48\xbe\x27\xf0\xaa\x10\xd8\x77\x5c\x54\xc0\x2f\x82\xc9\x0e\xa3\x60\xd2\x8f\x84\x89\x03\x21\x92\x8f\x04\x61\xf4\x81\xb4\x10\x34\x36\x41\xcf\x33\x05\x18\xfb\x04\x1d\x78\xed\x4d\xee\x5b\x7a\xcd\x81\x67\x0a\xa9\x97\xf0\xdc\xe2\xae\x90\x0a\xa9\x69\x8b\x87\xf2\x2b\x43\xee\x74\xff\x38\xe4\xea\x16\x9b\xd1\x16\x3d\x9c\xf5\xa4\x46\x2a\xd9\x9e\xc3\xa4\x5d\x7a\x16\xda\x8a\xd2\xce\x0e\xbe\x85\xa3\x95\xa4\x37\x7e\xa2\xb0\x72\xbc\x69\x31\x5a\x63\xc8\x2f\xab\x4f\x55\xd5\xd4\xa7\xbb\xd2\x88\xec\xac\xc9\x5d\x61\x0b\xfb\xfd\x4a\xea\xe6\x72\x4b\x2a\x67\xa5\x55\x19\x1b\x67\xa7\x77\x2d\xac\xcf\x78\x3a\xc7\xfd\xe3\xf2\x6c\x87\x81\x9c\x16\xfb\x94\x31\x77\x2c\xc2\x53\x8b\xc5\x7b\xca\xec\x66\x6d\x8c\xf5\x83\x4a\x40\x5b\xdc\xd3\x94\x1e\x0f\x9c\xee\x8b\x02\x1d\x07\x43\x41\x95\x52\x75\xd8\xf1\xb5\x58\xa6\xd3\x16\x22\xcb\xbc\xe9\x8b\x84\x9e\x1d\x07\xd8\x88\x48\x72\xbe\xe8\x48\xc1\x52\x44\x49\xa8\x9b\x6b\xfa\x18\x1d\x47\xba\x26\xd0\x3b\xd0\x62\x58\x60\x33\x92\x47\x94\xc0\x8f\xf4\xbb\x16\xa1\xe0\x0f\x93\xae\x08\x98\x9a\xfd\x1b\x02\xfe\x1f\xb4\xca\xc5\x93\x0e\x83\xf5\x2a\x1f\xef\xf5\xaa\xac\x0c\xe6\xbd\x34\x87\xba\xd3\x0b\x78\x63\xdd\xa7\x13\xd7\x08\xec\x1c\x85\x1b\xae\x71\x66\x11\x65\xab\x7f\x8e\x36\xa2\x77\x3a\xc6\x3c\x70\xd4\x81\x0c\xba\x1d\xb4\x73\xd0\xde\xb3\xe8\xd4\x26\xbe\x83\xf5\xbd\x5b\x27\x74\x90\x91\x23\x61\x63\x65\x84\xed\xd9\xc7\xb3\x95\x1e\x6b\xde\x8a\xe3\xe5\x2f\xf2\x04\x1b\x7b\xb7\x83\x9e\x67\x97\xc4\x16\x3e\x85\x96\x91\xf0\x5a\x8e\x60\x9a\x1a\xbf\x39\xb3\xaf\xf4\x7a\xa2\x16\x07\x7c\x7b\x63\xfe\xe1\x88\xf2\x14\xbc\x29\xd1\x4b\x12\xe5\x16\xf2\x5d\xed\x8d\xa1\x73\xba\x1c\xe6\xd1\x8c\xca\x8d\x9c\x58\xd2\xa9\xf7\xf4\xe4\x85\xc2\xf2\x6c\x5b\x7a\x6b\xa3\xca\x0e\x9a\x87\xa4\xf5\x7f\x29\xd6\xe7\xd3\xb8\x34\xfc\x12\xb8\x10\xf2\x05\x17\xfc\x52\x5f\x60\x8f\xb6\x10\xc9\x13\x02\xcd\x4e\xf7\x14\xc1\xce\x20\x81\xfb\x35\x61\xfb\x31\x1f\x36\xcf\x07\xad\xae\x33\x50\x5b\x7c\x7c\x29\xb4\xbb\x11\x7a\xb8\x88\x89\x15\x57\xbc\x34\xf3\xdd\xec\xa9\x74\xec\xcc\x95\xbb\xb9\xa6\xf0\xa5\x58\xc7\xcf\x27\xb5\xfe\x39\x37\x7c\x81\xce\xf6\xb8\x8c\x7f\xd4\x79\x9b\x85\xba\xd6\xba\xa9\xf1\x13\x07\xec\x32\xe7\xf2\x6f\x79\xee\x7f\x59\x85\x90\x6e\x8d\xca\x47\x7f\x73\xf8\x1f\x44\x18\x45\xe6\xb6\x69\x7a\xed\xed\x3a\xd2\xa2\xe7\xa9\xf9\x6a\x45\x5a\xbe\x97\xa0\x7d\x5c\x71\x98\xe2\x83\x29\xc7\xf1\xf9\xa5\x45\x19\xf1\xf5\x77\x77\x86\x86\x6f\x52\x37\xb5\xa1\xee\xd1\x8a\xba\x99\x33\xf1\xf3\xed\x04\x7e\xa5\x3e\xde\x88\x9f\xc8\xf3\xf0\x26\x7d\x8a\x9b\xfe\xb7\x02\xa9\xb7\x28\xa4\x5e\x95\x48\xbd\xa2\x91\x7a\x4d\x24\x75\x54\xe9\xef\x00\x00\x00\xff\xff\xd8\x0f\x61\x39\x52\x0a\x00\x00"), - }, - "/dygraph.min.js": &vfsgen۰CompressedFileInfo{ - name: "dygraph.min.js", - modTime: time.Date(2017, 12, 12, 22, 27, 49, 0, time.UTC), - uncompressedSize: 123954, - - compressedContent: []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xe4\xbd\x7b\x73\xdb\x38\xb2\x28\xfe\xff\xfd\x14\x12\xef\x39\x1c\xc2\x82\x68\x51\x79\xcc\x2c\x69\x44\xd7\xb1\x9d\xc4\x67\x12\x3b\x1b\x3b\xb3\xe3\xd5\xf2\xaa\x60\x11\x92\x70\x42\x91\x5a\x12\x92\xa5\xb1\xf4\xdd\x7f\x85\x17\x09\x52\x94\x9d\xd9\x9d\xad\xdf\x9e\xba\x53\x35\xb1\x08\x34\x1a\xef\xee\x46\xa3\xd1\x7d\x7c\xd4\x6e\xfd\x9f\x98\x8e\x49\x92\x93\xd6\x59\xba\xd8\x64\x74\x3a\x63\xad\x7e\xcf\xfb\xb1\x75\x8e\x93\xd6\x2f\x38\x89\x48\xf6\x0d\xcf\x5b\x4e\x84\x93\x55\xf4\xed\xff\x4c\xe7\x98\xc6\xee\x38\x9d\x83\xd6\xa7\xcb\xdb\xae\x2a\x1b\xb5\x9c\x19\x63\x0b\xff\xf8\x38\x5d\x90\x24\x4f\x97\xd9\x98\xb8\x69\x36\x3d\x56\xf9\xf9\xf1\xa7\xcb\x5b\xd0\x3a\x3a\xfe\x5f\xed\xc9\x32\x19\x33\x9a\x26\x0e\x03\x8f\x74\xe2\x58\xe9\xfd\x7f\x93\x31\xb3\x10\x62\x9b\x05\x49\x27\x2d\xb2\x5e\xa4\x19\xcb\x6d\xdb\x5a\x26\x11\x99\xd0\x84\x44\x56\x5b\x67\xce\xd3\x68\x19\x13\x20\xff\xb8\x0a\x14\x31\x07\x04\x24\xce\x49\x8b\xe3\xd3\xf8\x4b\x8c\x12\x8b\x6d\xcb\xbf\x2e\x9e\x47\x40\xfe\x74\x86\x21\x64\xb2\xe8\xe3\x0a\x67\x2d\x12\x10\xd4\x54\xeb\x03\x4d\xa2\xf4\x61\x20\xff\xf8\x4d\x10\xd3\x38\xbd\xc7\xf1\x40\xfe\x69\x84\xc8\x49\x3c\x19\xf0\x7f\x7c\x36\xa3\x39\x24\xee\xf9\x66\x9a\xe1\xc5\x8c\x37\x7e\xb7\x73\x8a\x51\x01\x8f\x19\x61\xcb\x2c\x69\xe9\x94\x16\x73\x08\xc4\x90\x82\xc7\x22\x25\x71\x52\x98\x8b\xd1\x6b\xe3\x61\x1a\xca\x5f\x44\xfc\xe2\xdd\x88\x51\xc3\x20\x64\xe4\xef\x4b\x9a\x11\xdb\x56\x3f\x02\x5e\x26\xb7\xed\x18\xa8\xfa\x62\x27\x85\xed\x1e\xe0\xe9\x99\x4e\xcb\x54\x1a\xc7\x3a\x43\x09\x79\x68\x5d\x64\x59\x9a\x39\xd6\x19\x4e\x92\x94\xb5\x26\x34\x89\xd4\x9c\xb4\x7e\xb0\x3a\x69\xc7\xfa\xc1\x02\x01\x9b\x65\xe9\x43\x6b\xe6\x8e\xd3\x88\x20\xeb\xd3\xf5\xf9\xd7\x8f\x17\xa3\xab\xeb\xdb\xd1\xbb\xeb\xaf\x57\xe7\x16\x9c\xed\x38\xbe\x25\xe2\x6d\x47\x8f\x6a\x12\xfd\xc7\xdd\x2e\xe0\x7d\x18\xf6\x42\x77\x8c\xe3\xd8\x59\xea\xf9\x85\xe6\x92\xe1\x45\x31\x12\x80\x5e\x38\x64\x61\xa0\x9a\x9a\x38\x78\xbb\x65\x60\x07\x97\xb0\x2c\xc8\xa0\x1c\xba\x9d\x02\xe2\x35\xea\xcc\xdd\x24\xcd\x1c\x8e\x2d\xfb\x9e\xe1\x82\x29\xea\x05\xe9\x09\x75\x63\x92\x4c\xd9\x2c\x48\x3b\x1d\x90\x38\x94\x8f\x79\xd1\x82\x9d\xf3\xe8\xf9\xc3\xb2\xb1\xbc\x72\x63\xd6\xa8\x03\x1e\xe5\xd0\x18\x03\x99\x13\x76\x4b\xe7\x24\x5d\xb2\xd6\x0c\xe7\x2d\x3e\xa8\xf7\x84\x24\x2d\xbd\x7e\xc0\xce\x98\xf5\x86\xf2\xe3\x98\xe0\xec\x7b\x31\x64\x6a\xcf\x45\x08\xa1\xb2\x62\x3d\xd9\x65\x8a\xc3\xa0\x5c\x08\x02\x92\x6e\xb7\xed\x08\xd8\xf6\x7e\x89\xc8\xc0\x02\xeb\xc5\x59\xb6\xd1\x4b\x39\x12\x29\xbb\x31\x66\xe3\x99\x43\xc0\xa3\x99\x25\xe7\x3a\x59\xc6\x31\xac\x02\x55\x01\xc4\xa6\x11\x00\xbb\xb2\x3f\xa9\xea\xcf\x18\x21\x64\x0e\x84\x6e\x9f\x99\xe6\x30\xd9\x23\x0e\x9b\x6c\xb7\xed\x31\xb0\xed\xc6\x32\x15\x4c\xb0\x8e\xc2\x68\xfa\xd8\x61\xcd\x7d\x1a\x9b\x7d\xda\xef\xd1\xd8\xec\x51\xa5\x3f\xb9\x03\x1e\x47\xb6\x3d\xb5\x6d\x67\x84\xda\x1e\x9c\xaa\xd5\x36\x98\xa0\xa9\x3b\x4e\x93\x31\x66\xce\x04\xf8\x2b\xd4\xf5\xe0\x44\xe5\xd9\x76\xec\x00\x63\x8e\x63\x47\x92\x83\x91\xdc\x2a\x0c\x65\x4e\x0e\x82\x11\x6a\xf7\x02\xbd\xe0\x09\xd2\x85\x03\x12\x80\x47\x9e\x3c\x45\x13\x38\x41\xc3\x30\xe8\x74\x56\x27\x24\x00\x53\xdb\x9e\x0e\x57\xa1\x9b\x2d\x13\x07\x04\xa2\xc2\xb2\xd4\x6e\x8a\x44\xdf\x44\x1b\xf9\x1c\x18\x5d\x98\xf1\x65\xcf\xd7\x29\xcd\xdd\xc9\x32\x41\x0c\x8a\x9f\x38\xcb\xf0\x06\x91\x12\x6e\xe9\x80\x47\x41\x06\x22\x38\x86\x0b\x54\xd2\xf2\xc7\x5d\xd0\x36\x88\x21\x1f\xd6\xa8\x69\x83\x96\xcb\x6d\x50\xfe\xf4\xa9\x1a\x6d\x06\x1e\x23\x44\x77\xbc\xf4\xb8\xa9\xb4\x39\xad\x03\xf3\xc3\x4f\x4a\x0c\x63\x94\xec\x76\x8e\xa4\x7e\x53\x31\x3c\xb2\xcb\x7c\x38\x82\x85\x9b\x90\x35\xbb\xa5\xe3\x6f\xa8\x4e\x9e\x88\xa0\x94\xa7\xbc\xcb\x0e\xce\xa6\xcb\x39\x49\x58\xae\xc6\xae\xeb\x89\x65\x58\x4f\x7e\xe3\x01\x3d\x3b\x18\x79\x01\x3e\xa9\x03\x04\xb8\xd3\x01\x64\x88\xbb\x5e\x88\x8a\xbc\x21\x0e\x83\x89\xbb\x58\xe6\x33\x87\xd7\x28\xc7\x1e\x40\xaf\x8d\x8a\xb9\xda\x6e\x47\xdb\x6d\xe6\xc4\x60\x07\x67\xee\x22\x4b\x59\xca\x47\x80\xcf\x2b\x32\x47\x59\x4d\x97\x8b\x17\x8b\x78\xa3\x56\x6e\x31\x6f\x60\x07\x17\x2e\xa3\x2c\x26\xc8\xba\xcf\xd2\x87\x9c\x64\x16\x5c\xb8\xea\x27\x6a\xf7\xe0\xc2\x25\xc9\x0a\x3d\x72\x38\x9c\x4d\x57\x7c\xa4\x16\xee\x8a\x64\x39\x4d\x13\x64\x59\xe5\x47\x2e\x81\xd2\x04\x2d\x39\x6c\x14\x7d\xa4\x39\x23\x09\xc9\xc4\x77\x9a\x8c\x89\xfc\x31\x99\x88\xbf\x19\x99\xa7\x2b\x52\x81\x91\x49\xa7\x71\xac\x53\x73\x91\x4c\xe6\x94\x89\x1f\x8b\x8c\x2c\x48\x52\xc5\xab\xd2\xae\x93\x71\x15\x57\x5c\xa0\x30\xa7\x50\x6e\xd3\x61\xc8\x1b\x7a\x4f\x93\x88\x26\xd3\x4a\xfe\x1e\x0d\x5e\x64\xe9\x98\xe4\xb9\x06\x6e\x51\x49\x85\xf3\xe5\x82\x2f\x69\x41\x82\xe1\xc2\x1d\x3f\x44\x68\x8f\xcb\x5b\xc7\x96\xc8\x9b\x45\x34\xfb\xbe\x4a\x04\xe8\x81\x2a\x96\x73\x9c\x7f\xdb\xaf\xa4\xd5\xdb\xed\xe0\xe3\x2e\x84\xfd\x7d\xee\x64\x2d\x73\xd2\xca\x59\x46\xc7\xcc\x0a\xae\x85\x28\xe6\x4a\xce\xf1\x39\x4b\x17\x24\x63\x1b\x07\x43\x6b\x34\x22\xf9\x27\xc1\xe6\x2d\xf8\xb8\xc2\xf1\x92\xf8\xed\xde\x4e\xee\x0c\x8a\x98\x63\xb9\xc7\xf7\x38\xcb\x2d\x00\x93\x86\xa1\x6c\x31\xdb\x66\x6e\x89\x63\xc0\xfc\xc7\x88\x4c\xf0\x32\x66\x3e\xdb\xed\x1c\x0a\x60\x66\xb6\x7a\x17\x64\xe5\x52\x15\x7b\x29\x71\x15\x3c\x34\x72\x5c\xb2\x66\x19\x1e\xb3\x1b\x92\x51\x62\x4e\xa1\xe2\xbb\x6a\x3f\x51\x98\xc0\x0c\xa6\x7c\x4d\xe6\x08\xbb\x53\xc2\x1c\x2b\x4e\xa7\xf9\x18\xc7\xc4\x02\x30\x46\xbd\x20\x3e\x61\x7a\x9b\xc5\x9d\x0e\xa0\x88\x0d\x63\x2e\x87\xc0\x4c\xfe\x22\x21\xcc\x6d\x9b\xef\x8a\x36\x42\x99\x6d\x3b\xd9\xb0\x17\x9e\xa0\xde\x76\x9b\x0d\x3d\xfd\xa3\xcf\x7f\x00\x9e\x29\xa8\x23\x80\x1a\x7e\xe0\x24\x88\xc3\x89\x04\xc9\x7d\x68\x7e\x85\xaf\x9c\x04\x0c\x52\xb9\x7b\x87\xbc\x91\xc3\x04\x26\x61\x08\xfc\x4a\x5a\x26\x9a\x31\xec\x87\x61\x08\x2a\x59\x7c\x8b\x0e\xc5\xbf\xfc\x9f\xb0\x14\x43\xd2\x5d\x65\x90\xb2\x34\x8e\x69\x32\x3d\x5d\x91\x0c\x4f\xc9\xde\x28\x11\xf4\x09\xb3\x99\x3b\xa7\x89\x43\xa0\x1e\x05\x35\xb1\x72\xe0\x60\x0e\x63\x38\x83\x4b\xce\x1d\xf8\x98\x26\xa8\xc7\x85\x21\x98\xa1\x1e\xcc\x51\xaf\x69\x00\x39\x03\x52\x83\xe8\x85\x70\x26\x7f\xf5\x43\xb8\x1c\xc6\xa1\xf8\xd0\x43\x41\xf5\x50\x50\xb0\xdd\x3a\x49\x07\xcd\x78\x77\xd3\x0e\xa2\x30\xe3\x1f\x5e\x08\xf3\x0e\xf2\x00\x8c\xbb\xe4\x0d\xea\x49\xf2\x1a\x71\x14\x5d\x12\x06\x0a\x49\x34\xf4\x42\x8d\x87\xff\x16\xa8\xba\x28\x1a\xf6\xc5\x1c\xa6\x5d\x01\x01\x33\x95\xc4\x71\x76\x91\x07\x76\xa2\x35\xf9\x60\xa8\x27\xdb\x3b\x4a\x8f\x73\x38\xf4\x8e\x92\xe3\x1c\x7a\x47\xd9\x71\x1e\x86\x7e\x91\xbb\x37\xe0\x5a\xa6\x5c\xee\x20\xd6\xcb\x13\x65\xb0\xe4\x64\x45\xea\x0e\x3e\xea\x0d\xe2\xbf\xda\x85\xf0\xc5\xff\xc3\xdb\x10\xe6\x7c\x23\xc6\x7a\x23\xe6\x74\x3a\xc7\x16\x80\xb3\x86\x9d\xb9\x44\xbd\x60\x59\x2e\xac\xa5\xda\x99\x4b\x39\xab\xf2\x17\x09\xe1\xac\xd8\x99\xa9\x6d\x3b\xa9\xde\x99\xfc\x47\x37\x3e\x4a\xe5\x06\xe5\xfb\x32\xad\xee\xcb\x94\xef\xcb\x54\x4f\x6d\x6d\x5f\xe6\xb5\x7d\x29\x77\xa6\x93\x21\x89\x11\x56\xf3\xbb\x19\x4c\x3a\x19\xe4\x39\x7c\x9b\x02\x3f\x3f\xb4\x4f\xeb\x9b\x35\xff\x17\x6d\x56\x18\xc1\xb1\xe0\xc2\xb5\x81\x16\x3b\x98\xa2\x5e\x40\xcb\x81\xa5\x7c\xc7\xf2\x74\xbe\x9b\x97\x72\x47\xc3\x44\x55\x85\xd7\x4e\x0f\xd2\x2e\xe9\x78\x20\x48\x4e\x68\xc7\x0b\x12\x7e\xf2\x91\x23\xe6\x70\xfa\x98\x84\x72\xcf\xc9\xb1\xcb\xf8\xee\x8b\x3b\x1d\xbe\x6f\x33\xb8\xec\x48\x34\x8b\xf4\xc1\x11\x90\x7d\x41\x07\xfa\x00\x04\xf1\xc0\x99\xc9\xcc\xfc\xef\x19\x73\x96\xe0\x38\x86\x11\xca\x8f\x63\x38\x1e\xd2\x10\x0d\xd9\x90\x8a\x89\x8e\xe0\x30\xea\x2e\x8e\x66\x30\xea\x2c\x8e\x66\x62\x16\x52\xe4\x21\x44\x06\x02\xc2\x0b\x7d\x31\xae\xd5\x42\x29\x1c\xa6\x30\x0d\xc3\xe2\xe0\x37\xfe\xdd\x9b\xf4\xe5\xff\xd3\x9b\x54\xaf\x22\xbe\x86\xc6\xf5\xcd\xba\x68\xd8\xac\x53\xd4\x0b\xa6\xe5\x9a\x9a\xaa\xcd\x3a\x2d\xd8\xe8\x54\x6c\xd6\xc5\x93\x6c\xb4\x99\x7b\xa6\x48\x30\xc1\xbc\xc2\x44\x53\xbd\xe0\x52\x30\x88\x8a\xdd\x26\xe7\x9d\x77\x40\x2c\x94\x18\xe5\x83\xf4\x38\xf7\x7b\x70\x86\xf2\xc1\xf8\xa8\x5c\x6e\xf1\x91\xe3\x75\x63\x70\x9c\x03\xdf\x83\x4b\xe4\xf5\x7a\x47\x33\x98\x88\xbf\x31\x8c\xaa\x9b\x7b\x09\x93\xce\x52\xe1\x04\xc0\x8f\x9e\xdc\xdb\xf5\x0d\x1e\xfd\xe1\x1b\xfc\x69\xfa\xf9\x40\xe3\x3c\x4d\x2e\x13\x46\xb2\x15\x8e\x25\x15\x85\x11\x92\x87\xbf\x0c\xf5\x82\xac\x9c\xa4\x8c\x6f\xfc\x65\x07\xb1\x61\xa6\x77\x66\x54\x7e\xbd\xe0\x2c\x93\x73\x5d\xdb\x76\x96\x5d\x9e\xdc\x25\x05\x98\xf9\xfd\x22\x94\x2d\x1c\xcb\xa2\x3d\x4e\x75\xa2\xc1\xf2\x38\xf2\x7b\xfc\xa8\x33\x03\x74\xe2\x44\x92\x75\x4f\xd1\xe2\xa4\x37\xe8\xf9\x0b\x38\x41\x11\x1c\xa1\xd8\x98\x92\x29\x9f\x92\x29\x38\x9e\x74\xe2\xa3\xf8\xd8\x79\x79\x34\x39\x9a\x00\x00\x57\xc8\x13\x09\x51\x40\x91\x33\x95\x79\xfd\xa3\x08\x74\x47\xe0\x78\x05\x93\x4a\x5a\x47\xa4\xe5\xc3\x2c\x44\xc3\x31\xe4\x93\x39\x85\x43\xfe\x87\x8a\x8f\x24\x0c\x77\x42\x4d\xa8\x21\x7a\x70\xd8\x83\xbd\x30\x94\xca\xc3\x14\x45\x03\xb3\x41\x0b\xde\xa0\x05\x38\x8e\xf8\x1a\x31\x91\x2e\x24\x52\x67\xd1\x4d\x01\x94\xbf\x3a\x29\x28\x25\x82\xfc\x77\x13\x9b\x57\xcf\x10\x1b\x43\x87\xf4\xbd\x94\xe2\x1f\xa2\x4f\x89\xa4\x4f\x11\x66\x78\x86\x93\x28\x26\x99\xc5\xe9\x0d\x75\x12\xc0\x39\xae\x63\xb9\xee\x71\x24\xf5\x96\xdd\x18\x6f\xd2\x25\xb3\x00\xcc\x11\x75\x52\x2e\x48\x9b\x07\x0f\xdd\xd3\x52\xd7\x01\x76\x41\x5c\x23\x55\x05\x14\x8c\xbf\x9b\x54\xed\x2a\xb0\xcf\xec\xa7\x2a\x70\x9a\x7c\x4e\x69\xc2\xf2\xb3\x8c\x60\x46\xa2\x51\x05\xbc\x24\x82\x18\xf5\x02\x5c\xee\x92\x4e\x07\xcb\xc5\xcb\xe9\x19\x0e\x61\x82\x08\x3f\x77\x27\xee\x66\xc4\xd2\x05\xba\xc2\x57\x90\xff\xbe\x4f\x19\x4b\xe7\xfa\x73\x85\xe3\xd1\x9c\x26\xcb\x1c\x95\x23\xb1\xc0\x59\x4e\xde\xc5\x29\x66\x0e\x95\xb2\x29\xd0\xa0\x8b\xf8\x49\x48\x2f\x04\xbb\x6a\x57\xa6\x84\x5d\xac\x59\x46\xe6\xe4\xee\x17\x3e\x85\x4f\x92\x74\xa9\xad\x91\x84\x95\x4f\x63\xa1\x8a\xe0\xf2\x7b\x90\x9f\xa0\x34\xc8\x39\xbd\x9e\x38\x8a\xe8\x0a\xe1\x3d\x17\xf5\xda\x76\x5b\x4b\xe8\x5a\xb9\x2c\xb2\xa4\x6c\x3d\x2b\x3e\xbc\x30\x88\xdf\x50\xdb\x76\x62\x44\x01\x9c\x9d\xf0\x9f\x33\xfe\xd3\x51\x04\x3b\xdb\x6e\x67\x6f\x32\x49\xe1\x67\x65\x72\xb2\xdd\xc6\x27\x09\x4f\x4e\x50\xac\xd9\xf5\x30\x81\x59\x58\x9f\xbb\x8f\x34\x21\x17\x7c\xbd\xf2\xb9\x7b\xb2\xbb\xbd\x20\x29\xa7\x2f\x51\x9c\x28\x09\x21\x55\x53\x96\x9b\x8b\x73\x7c\x77\x95\x66\x73\x1c\x8f\x1c\xc2\x01\x8a\x89\x83\x18\x88\x02\x6a\x5e\x9f\x2b\xc3\x67\x10\x62\x60\xee\xfc\xf8\xe0\xce\xdf\xdb\x44\xbe\xf7\x02\xd6\xf6\x9d\xff\x7a\x17\xc2\xd7\xff\x1a\x21\xc4\x94\x1f\x60\x82\x68\x90\xb8\xbf\x72\x99\xcf\xbd\x43\x1e\x4c\xdc\x8b\x5f\x6f\xbf\x9c\xde\xa0\x3e\x4c\x7e\xc7\xae\x34\x61\x73\x01\x74\x9b\xca\xed\x76\x78\xae\x38\x2b\xab\xf1\xa4\x4e\x27\x93\xeb\x2c\x15\xdc\x04\xe6\x48\xc8\xdb\x31\x52\xeb\x25\x1f\xf0\x1f\x7e\x62\xee\x91\x9c\xf3\xbf\xc7\xb5\xcf\xf7\xde\x46\xfc\xbb\x5e\xe1\x1a\x4c\x2a\xb6\x1b\x9f\x2a\x3f\x86\x09\x9e\x13\x9f\x40\x1a\xad\xfd\xac\x83\x77\x01\x95\x2c\x7d\x56\x88\x8b\x42\xf7\x55\x27\x17\x0e\x83\x14\x40\x5a\xed\xea\x33\x34\xa5\x0a\xfc\x2c\xb5\x4a\x7e\xd7\x16\xaf\xb7\xe4\xe9\x1d\x22\xa0\x8b\x01\x69\x12\x3d\xd5\x10\xb3\xc1\x15\xbe\xf2\x99\xb9\x94\xe9\x81\xa5\xbc\x0b\xe1\x8f\xff\xde\xac\xcb\x11\xbc\x4b\x66\xc9\x1a\x2c\xc0\x79\x19\x75\x32\xce\xb9\x2a\x92\x74\x5e\x63\x4f\x69\xc1\x9e\xf2\x7f\x4e\x92\xe6\xeb\x7c\xd9\x20\x34\x73\xb9\x2c\x2a\xd7\x7e\xa4\x48\x55\x54\x08\xcd\x91\x10\x9a\x97\xff\x0a\xa1\x79\x56\x15\x9a\xeb\x02\xb3\x96\x85\x67\xa6\x2c\x5c\xc8\xc0\xb3\xef\xd0\x43\xcd\x76\x95\x61\xfb\xa7\x24\x5f\x45\x28\xc4\x25\xdc\xa1\x13\x6c\xc6\x45\x57\xaa\x39\x53\x5a\x7e\x79\x21\x3f\xc0\x4a\x41\x36\xe3\x82\x2b\x55\x82\xab\x54\x0e\x95\xdf\x9e\x12\x64\x73\xa4\xcf\x91\x31\x4a\x07\xd9\x71\xea\xf7\x82\x44\x9c\x2f\x73\x21\xee\xc5\x85\xa4\x97\x98\x9b\x24\x3f\x2c\xe9\x55\x09\x3b\x34\x16\xa3\xff\xd3\x2e\x84\x3f\xfd\x0b\xcf\x9a\xd5\x0d\xf1\x6f\x78\xe4\xe4\x73\x9b\x34\x6c\x8e\xa6\xc3\x4a\xc9\x18\xe4\xe2\x16\xbf\x48\x18\x24\xb6\x9d\x9f\x88\x09\xce\xd5\x4e\x50\x24\x5d\x2c\xd9\x82\xac\xd3\x7f\x81\xb6\x05\x0d\x43\x7e\xca\xf1\x10\x22\xfa\x0a\x91\x3d\xa9\x65\x49\x95\xde\xf4\x9f\xd2\xb0\xe4\x9d\x8e\x5c\xe2\x32\x2f\x88\xf9\xf2\x14\xba\x4c\xa5\x00\x39\xce\x85\xee\x92\x16\xba\xcb\x62\xcd\xc6\xd5\x41\xf8\x57\x48\x92\xba\xf1\xa5\x18\x59\xd1\xf3\x1a\x22\x21\xd5\x22\x21\xad\x88\x84\x54\x8b\x84\x14\x68\x7a\xa2\x64\xc2\xef\x3a\x58\xed\xc9\x51\x7f\xfa\x57\x6e\x30\x25\xca\x2d\x19\x8d\xf7\xb5\x3a\x74\xe2\xd4\xb6\x57\xb9\x4a\xe4\x5d\xe1\xe3\x2e\x28\x24\x6f\x56\xde\x02\xb6\x68\xd2\x62\x40\x35\xac\x9c\xae\x19\xce\xaf\x1f\x12\xdd\x44\x75\xba\x82\x98\x8f\x16\x3f\x96\x88\x23\x4a\x41\x82\x49\x31\x58\x0c\x12\xb5\x91\xcd\x36\x5b\x9c\x13\xfe\x7e\x82\x50\xe5\x9c\xda\xc6\x42\x74\x95\xcb\x4d\x0a\xf9\x48\xdf\xfd\x4a\x19\x17\x51\xf9\x45\x62\x32\x27\x09\x43\xa4\xf2\x79\x96\x26\x8c\xac\x19\xc2\x32\x75\x46\xe8\x74\xc6\x10\x53\x3f\x46\x32\xf5\x81\x46\x6c\x86\x98\xfc\x3b\x82\xed\xc4\xa5\xf9\x19\x4e\x56\x38\xbf\xd1\xf7\x60\x8e\x89\x14\x00\x71\x8b\x66\x49\x98\xbd\x3b\x33\xd7\x0a\xd4\x1d\x27\xc1\x88\xf2\x8d\xf0\x39\x4e\xd9\x69\x46\xb0\xba\xf3\xcd\x50\xa5\x3f\xee\x58\xe0\x19\x8d\xd9\x7a\x14\x64\xee\x3d\x99\xd2\xe4\x33\x66\x33\x07\xc0\xcc\xcd\xc8\x98\x39\x05\x3a\x77\x0d\xcb\xdf\x1b\xe3\xf7\x83\xf1\x7b\xc6\xcb\x8d\x63\xba\x70\xc4\xbc\x54\xaa\x9a\xd1\x28\x22\x89\xa8\x0a\xfe\xb1\x55\x55\xc4\x1c\x57\x5c\x7d\xef\xdd\x04\x57\x27\x45\x02\x7d\xe1\xb5\xf6\x60\xcf\x98\x0a\x73\xae\x40\x8d\xdb\x93\x24\x22\xfb\x88\x47\xcb\x45\x84\x19\x91\x22\xb3\x03\x24\x82\x91\x04\xe6\xd2\xeb\xd9\x0c\x67\xcc\x11\xb8\x46\x53\xc2\x2e\x19\xc9\x30\x4b\xb3\xcf\x19\x89\xe8\x18\x33\xd2\xb8\x58\x07\xb9\x3b\x5a\x68\x88\xdb\x19\x66\x37\xdf\xe8\x22\xbf\x98\x2f\xd8\x46\x56\x24\x34\xc4\x02\xe7\x93\x60\x35\xd1\xdd\x10\x8a\xdb\x08\xb1\x21\x09\xc5\x49\x4f\xe0\x89\x32\xfc\x70\xc3\x36\x31\x89\x78\xab\xf7\xf6\x82\xe0\x0d\xb1\x64\x57\x7c\xc1\xaa\x69\x85\x4b\x34\xe3\xcb\xec\x6d\x9a\xc6\x04\x27\xd7\x0b\x51\xc6\xca\x19\x59\xf0\x95\x67\x41\xe6\xe6\x84\x5d\xe1\x39\x01\x01\x5f\xdb\xc2\x82\xe0\x23\xfd\x46\x24\xd9\xa4\x92\xb5\x05\xf2\x0e\xac\x09\x13\x6f\xd6\x7b\xbc\xb8\x88\xa6\x6a\x88\x4d\x94\x70\x8c\x98\xbb\x10\xc9\x70\x81\x8a\x74\x38\x45\x89\x3b\x16\xa7\x17\x3d\xdc\xce\x18\xf6\xe0\x58\xd1\xf6\x43\x53\xe1\x34\x35\x60\x9c\x26\x09\xe1\x2c\x7f\x81\x33\x7e\x08\xd1\xad\x58\x00\x00\xe0\x04\x51\xdb\xd6\x06\x54\x6f\x50\x1f\x8e\xf8\xd0\x64\xf8\x81\x26\x53\xb5\xd4\x82\x91\x9b\xe3\x15\x71\x00\x9c\xd8\xf6\x88\x37\x91\x8f\xef\x39\xce\x67\xb5\x4f\x87\xca\x71\x58\x21\x3d\x1b\x42\xca\x70\x18\x9c\x42\x0c\x63\x98\xc1\x08\x2e\x21\x01\x81\xca\x96\x0d\xb9\x16\x47\x24\x87\xc1\x15\x4c\x21\x81\xf1\xf3\xd5\x0c\x43\x00\x47\x6e\x46\x72\x96\x66\x44\x2d\xcc\xb2\xba\xfd\x89\x57\x62\x81\x52\x95\x88\x6b\x53\xc1\x2b\x23\xf9\x67\x2c\xff\x2c\xb8\xcc\x33\x45\xed\x1e\x9c\xec\x0f\xc1\xa4\xb2\xdd\x27\x6e\xce\xb2\xf4\x1b\x11\xab\x0d\xe5\x70\xe2\xc6\x34\x21\x7f\x11\x94\x10\x17\x16\x3d\x23\x44\xa4\xa9\xc6\x08\xae\x10\x71\x49\x12\x8d\xe0\x06\x11\xb7\x58\xef\x23\xb8\x46\xc4\xcd\x19\xce\xd8\x28\x58\x9f\xac\x82\xb5\xba\xa6\x9d\xa1\xd1\x70\x1d\xc2\x8d\x64\xf3\x3c\xcb\xb6\xdb\x1b\x67\x04\xd7\x20\x00\xeb\x4e\x87\xf3\xa6\x35\x42\x2b\x70\x9f\x11\xfc\x2d\x90\xe0\x3b\xc5\xb0\x10\x42\x33\x45\x15\x37\xdb\x6d\xf1\xb3\x5d\xa6\x82\xb4\x38\xbb\x2c\x6d\xdb\x99\xb8\xf3\x74\x45\x6e\x53\x67\x09\x23\xa0\xfa\x72\x9b\x3a\x1a\x7c\x0d\x23\x00\xe0\x12\xc9\xd1\x92\x76\x99\x74\xe2\xc4\xa8\xed\xc1\x6c\xbb\x55\x55\x2e\xc1\x23\x11\xc6\x37\x97\xd1\x7a\x84\xd6\x50\x7e\x38\x7c\x81\x0b\xfe\x78\x45\xd6\x6c\x40\xdc\x05\x21\xdf\x74\x33\x04\x05\x10\x0b\x66\xae\x15\x09\xe3\xed\x76\xdc\x46\xe3\xa0\xd0\x2c\x2c\x6d\x7b\x0e\xf9\x01\xab\x3d\x95\x6d\xe6\x69\xdb\x6d\x81\xd2\xb6\xe7\x40\xe8\xb7\xda\x3d\xb0\xd3\x7d\x1a\x60\xdb\x76\xd2\xef\xed\x59\x43\x72\x39\x52\xc0\x2f\x70\x34\x65\x43\x27\xd9\x6e\x63\x60\xdb\x0b\x25\xd9\x36\x00\xc1\x99\x4b\xa3\x75\x08\x04\xa1\x29\x2a\x2e\x67\x63\x37\x45\x6d\x4f\xcb\x81\x7a\x65\x39\x00\x2e\x8a\x75\x6d\xee\x93\x86\xd5\x5d\x0a\x83\xd9\xde\xc2\x55\x16\x92\xc4\xb4\x90\x7c\x94\xc7\x29\x32\x4c\xc3\x20\xd3\x5b\x1b\x2b\xa9\xa5\x20\x8b\xe6\x2f\x4d\x95\x32\x98\x0b\x11\x5f\x9c\xde\x60\x02\xf3\x61\x3f\x94\xcc\x4f\x6f\xc5\x2a\xc3\xa9\x70\x16\x93\xef\xe8\x06\x33\x64\x08\x23\x9a\x0e\x92\x42\x84\x0d\x48\xb7\x1b\x18\x36\x58\x9c\xde\x43\x8a\x70\x21\xbe\xf3\xec\x47\xa9\x68\xc0\x43\x1a\x06\x89\x1e\x60\x64\xb0\xdc\xa3\xc4\x5d\x77\x4c\xd6\xac\xa1\x36\x06\xd4\xec\x28\x71\x37\x06\xd4\xa6\xde\x95\x1a\x3f\xac\xf1\x25\xd1\x3e\xce\x63\x10\xd9\x6e\x1b\xd8\x35\x97\xcb\xf7\x7b\x9a\x57\x12\xd5\x28\xe7\x52\x00\x1a\xa7\x71\x9a\xe5\x75\x61\x47\x24\x7e\xc2\x8b\x51\xa0\xd4\xbe\x95\xec\x29\x61\x9a\xe8\x2f\xe2\x94\x31\x71\xba\x9c\xa1\xb8\xc6\xb8\x66\x9c\x71\xcd\xd0\x70\xa6\x8e\xd6\x4b\x2e\xee\xf2\x51\x96\x4a\xf6\x8a\x75\xdb\x23\x45\xc2\xa2\x4d\xd9\x78\x3c\x57\x1d\xa4\x20\x88\xda\x28\xb6\x6d\x67\xc9\x4f\x3f\x11\xd8\x95\x88\x67\x26\x62\x3d\xab\x63\x34\x1b\x62\x71\x27\xce\xe9\x56\x71\x74\x91\x57\x97\x69\xe5\xea\x72\xe2\xf0\xc6\x4c\x43\xd8\x66\xdb\x2d\x45\x48\x59\xf6\x4d\x50\xca\x13\x47\x68\xcc\xe9\x22\xe5\x32\xfa\x52\x9a\x5b\x2e\xc0\x38\x4d\x18\x4d\x96\x24\x18\x21\xde\x9e\x9d\x64\x4f\xc6\x00\x0f\x69\x08\x37\x87\xfb\x25\x77\xa3\xa0\xec\xa2\x6f\xc5\x7e\xc9\x2a\x2c\x60\x05\x33\x83\x05\x6c\xe0\xc8\x79\x94\x53\xec\x4f\xa0\x9a\x56\x9f\xc2\xea\xd6\xf4\x33\x28\x9a\xe0\xaf\xa0\x51\x8b\xbf\x81\xaa\x1d\x7e\xa5\x51\x10\xaf\x69\x5e\x4d\x72\x79\x92\x3a\x74\x50\x92\xbf\x4b\x33\xc5\x6f\x29\x80\x0b\x25\x34\xfb\xc5\x8a\x86\x52\xff\x7b\x99\x44\x64\xed\x4f\xd5\xd7\x59\xba\x4c\x98\x9f\x16\x52\x05\x4d\xa6\x31\x91\x58\x44\x9b\x19\xc4\x71\x2c\xbf\x95\xd4\x96\xee\xf6\x37\xfc\xe8\xb3\x9c\xfd\x1c\x3d\xf2\x41\x50\x5f\xbe\x29\x16\xe6\xee\xc8\xc8\x72\xb8\x64\x3a\xa1\x71\x7c\x00\xd4\xc8\x12\xa0\x24\xcb\xd2\xec\x00\xac\x99\x27\xac\x5e\x61\xb5\xae\x06\x43\xd0\x92\xb4\x61\x43\xe4\xa2\xfc\x77\x39\x11\x7c\x2b\xf3\x95\x70\xb5\x9c\x93\x8c\x8e\xab\x0b\xe2\x6d\x9a\x45\x24\x53\xcb\x02\xf3\x03\x1b\x31\x57\x4d\x41\xb4\xcf\x70\x1c\xdf\xe3\xf1\x37\x0e\xb4\xdd\x26\xee\x19\xcd\xc6\x31\xc9\xdd\xf3\x8b\x77\xa7\x5f\x3f\xde\xc2\xb8\x5a\x4e\x22\xff\x8c\x79\xbb\x13\x81\x78\x26\x01\x1a\x44\x4a\x2d\xc5\x61\xce\x58\x9a\x5a\x2a\x16\xe0\x0d\xfd\x8d\x70\x98\x20\xb3\x6d\x6a\xdb\x7b\x52\x32\xa7\x5e\xfb\x2d\x90\xdd\x3b\xe3\xab\x53\x54\x40\x3b\xfd\xa3\x4c\x58\x1f\xa4\x70\x09\xf6\x65\x6d\x87\x41\x26\xf7\x13\xa4\x05\x98\x98\x08\x73\x76\xbe\x77\x26\xf8\x2e\x6e\xea\xb5\xc0\xf5\x56\x58\x69\x70\x09\xa0\x41\xd0\x5d\xe6\x2c\x9d\x4b\x08\x2e\x8e\xec\x43\xf0\x85\xf5\x5e\x1c\xb2\xc5\xe9\x7c\x9c\x26\x79\x1a\x13\xf7\x01\x67\x89\x78\x3e\xf1\x03\x6b\x2d\x73\xd2\x2a\xc0\x5a\xa9\x28\xd8\x7a\xa0\x6c\xd6\x12\xf5\xb7\xa4\x99\x88\x52\x38\x35\x32\x5c\x3d\x14\x71\xe3\xb4\x70\xdc\xa7\xf1\x62\x86\x9f\x98\xdf\xf2\xf0\x21\x66\xb7\xe0\x17\xd1\xfe\xa9\x60\x09\x7b\x70\xf9\xdc\xa9\xa0\x71\xb0\x0e\x9c\x0a\x30\x3f\x15\x8c\xc5\x95\xa9\xbc\x47\x9d\xa2\x61\xd7\x83\x5d\x2f\x84\x13\x94\xb8\x2c\xfd\xf2\xfe\xed\xc8\x49\x01\x1c\x21\x2b\x9b\xde\x63\xc7\xea\x4c\xdc\xac\x63\x41\xfe\x77\xaa\xfe\xde\x8b\xbf\x71\xc7\x02\x56\x90\xb9\xbc\xcb\x92\x4e\xd6\xce\xcd\x85\xa8\xbc\x7a\xea\xe6\x63\xbb\x5d\xa5\x34\x6a\xf5\xe4\x6f\xa9\xb2\x62\x60\x17\x44\x5a\x08\x54\x32\xc0\x06\x45\x4a\xe8\x0c\xda\x33\xdb\x5e\x39\x1b\x77\x03\xb6\xdb\x59\x71\x5b\xba\x00\x3c\x75\x01\x06\xa2\x7b\xbe\x43\xd1\x70\x53\x5c\x26\xc2\x8d\xbc\x88\x14\xb6\x6b\xce\x02\xf1\xc2\x50\xe9\xc7\x86\xbd\x90\x4b\x99\xfc\x6f\x35\xdd\x53\xe9\x9e\x4e\xe7\x10\xcc\xd5\xd4\xd7\x9d\x1d\xf1\x94\x8e\x91\xb2\x81\x02\xba\x06\xe3\xd5\x61\x04\xfe\xb1\xe0\xd3\x03\x27\xd3\x22\xe8\x18\x4e\xc5\x8d\x59\xa6\x45\xd6\x4d\x21\x50\x3e\x91\xe1\x85\x00\xf8\xdf\x85\x84\x1e\xce\xe0\x48\xca\x9c\xb1\x44\x2b\xf4\x17\x69\x4e\xe4\x6c\x02\x38\x45\x14\x8e\x51\x51\x0c\xec\xe4\xdc\x6b\x36\x31\xc1\x39\x93\x6a\x9f\xcf\x59\xba\xde\x34\xd0\x83\x61\x08\xb1\x3c\x8d\xc9\x73\x35\x4c\x84\x4d\x6b\x4d\x77\xd7\x76\xb4\x3c\x7b\x82\x3c\x60\xda\x08\x90\x42\x80\x08\xf0\x9b\x5e\x80\xbb\x5d\x6d\x25\x20\xcc\x03\xe8\xc4\xe9\x23\x24\x7a\xa9\xa4\x46\x69\xbc\x1f\x24\x7c\x4e\x10\xef\xa5\x6d\x27\xc3\xbe\xf8\xdd\x0f\x6d\x9b\xb8\xf9\x22\xa6\x63\xe2\x60\xe8\x81\xdd\xae\x6a\x8c\x60\x54\x56\xa9\x45\x55\x61\xdb\x7d\xc4\x13\x3a\x5e\x38\xec\x85\x83\x0a\x2a\x1f\x77\x3a\x3b\x41\xe6\xd4\xc1\xbb\x6f\xdb\x6d\x35\x0a\x19\xea\x05\xa2\x64\x2f\x14\x58\xb2\x4e\xa7\xd8\x27\xd2\x5a\x12\x4a\x7d\x3a\xc4\x28\x33\x9a\x21\xc5\xb5\x6a\x6f\x3d\xd5\xdb\xf2\x68\x98\x16\xc7\xa8\x1c\xa4\x08\xc3\x1c\xe1\xf2\xa9\x5d\x2c\xba\x1d\xc4\x27\xe2\x25\x57\x3f\x1c\xa4\x08\xfb\xf1\x1b\x22\xcd\x09\x84\x22\x1f\x83\xdd\x4e\x6a\x50\x38\x0c\x67\x3d\xc3\x3c\x0c\x8a\xce\x65\xb0\x18\x95\x0c\xc0\xf4\x24\x1f\x38\x44\xdf\xe3\x42\xf5\x6b\x09\x80\x9f\xbe\x29\x73\x96\x45\xce\x0c\x00\xbf\xf8\xb9\xdb\xed\x4c\x45\x28\x06\x8f\x99\x83\x81\x31\x14\x3d\x98\xa3\xf2\x60\x73\x92\x97\x87\x9b\x58\x1e\x6e\x3c\x84\x62\x3e\xf4\x4c\x2f\xdb\x58\xdc\x5a\xf3\x43\x8b\xdf\x97\x79\xb6\xcd\xf4\xbe\x28\x33\x77\xa4\x78\xc6\xe3\xf0\xb1\x2c\x27\x5a\xa8\xcd\x61\xd2\x29\xea\x85\x7c\xcd\xee\xaa\x9a\xd7\x04\x66\xfa\x8c\x25\x2e\x13\xb2\x74\x99\x44\x4e\x02\x82\x72\x16\xf0\x76\x9b\xb7\x11\xd6\xad\xc5\x5d\xfa\xc6\x83\x33\x94\x77\xf1\x1b\x2f\x48\x9d\x78\xbb\x9d\x01\x88\x51\xbe\x53\xa3\x31\x14\x58\x43\xb0\x53\x4a\xe4\x47\xd9\x66\xbf\x7a\x08\xc9\x9d\x3e\xe4\x3f\x76\x50\xf6\x77\x2f\xdb\x53\xd9\x92\xcb\xfb\xc6\x81\x2c\x75\xda\x3d\x00\x59\x71\xfa\x94\xe2\x59\x13\x84\xda\xd0\xb0\x20\xe3\x4d\x40\x06\x8d\xdf\xc1\x82\x44\x34\x41\x1a\xf4\x63\x07\x47\x63\x21\x8f\xee\xbf\x95\x48\x76\x8a\x82\x94\x82\xe1\x1e\x51\x60\x6e\x5d\x7c\xb5\x6d\xc1\x33\x5c\x43\xf2\x2d\x89\x45\x55\xf8\x10\x1c\xf2\x23\xbe\x27\x71\xee\x00\x37\x17\x6b\xd9\x03\x95\xb3\xe6\x1b\xd4\xe3\x07\x4e\x40\xdc\x15\xcd\xe9\x3d\x8d\x29\xdb\x38\x60\x48\xc3\xed\x16\xeb\xe5\x4f\xa1\x7c\x49\xd4\x78\xd4\xed\x05\xec\xa4\x40\xc7\xe4\x81\xe6\x39\x21\x65\xc8\x42\xa0\xee\x26\xda\x3d\x35\xf9\x6d\x6f\xe7\x80\xe2\xfc\x24\xe4\x32\x83\x9f\x08\x79\xa1\x26\xb5\xc3\x08\x15\x32\xc2\xf8\x80\xc4\x81\xc7\xdf\x48\xf4\x5e\x5d\x40\x2c\x24\x90\x90\x00\x73\x87\x13\xf6\xc7\x1d\x9c\x1c\xb8\x5e\xd0\xbb\x8b\x70\x69\x65\x5c\x34\x2c\x41\xb4\x24\x90\x09\x1f\xbd\x44\x93\xe3\x0c\xd1\x61\x12\x06\x45\x49\xf5\x9e\x42\x5a\x54\x8d\x50\xd4\xf5\x82\x11\x2f\x30\xd2\x05\x56\xfb\x72\xd6\x06\xe1\xe1\x28\x3c\x24\x2b\x1a\x63\xb8\x51\x36\x52\xeb\xe7\xc4\xb1\x0d\x80\xf3\x67\xc4\xb1\x0d\x80\xf7\x68\x31\x1c\x85\xf0\x01\x91\x83\xe7\xaf\x0d\x80\xa7\xc8\xeb\x3c\xb8\x73\x9a\x6c\x56\x38\x3e\x7a\x70\x37\xe2\x02\x35\x38\x3d\xe9\x0d\x4e\x51\xcf\x3f\x7d\xe3\xd9\xb6\x73\x8a\x3c\x0e\x39\x73\x67\x47\xa7\x9d\x99\xbb\x11\x42\xe5\x35\x3c\x47\x4b\x5e\xc3\xc5\xbe\xb0\x77\x0e\x7b\xf0\xfc\x8f\x14\xf6\x36\x5c\xd8\xfb\x28\xc4\xbc\xdb\x42\xcc\xbb\x29\xc5\xbc\x7b\x00\x3f\x17\x62\xde\x8d\x12\xf3\x6e\x94\x98\x77\xa3\xc4\xbc\xb5\x10\xf3\x56\x86\x98\xf7\x19\xae\x2a\x62\x1e\xef\xd7\x19\xfc\x84\xda\xbd\xc0\x39\x2f\x58\xde\x11\x51\x97\x46\xdb\x6d\x61\xd4\xe1\xbe\xbb\xfe\x72\x76\x31\x7a\x77\x7a\x73\x3b\xfa\xfc\xe5\xfa\xd7\x3b\x2e\x5f\x09\x7d\x72\x4d\x78\x70\x56\xa0\xe4\x05\x57\xf0\x1d\x1a\x86\xc1\x45\x29\x10\xd2\x89\x73\x85\x2e\xb4\x0e\x32\x71\x69\x7e\xfd\xb3\x73\x25\xe4\xc1\xb9\x7c\x9d\x2a\x89\xc6\x27\xdb\x3e\x43\xe8\xca\x5d\xaf\x70\x5c\x2a\x0b\x3e\xa1\xb6\x07\xcf\x54\x32\xcc\xd0\x74\x78\xa5\x65\x1a\xa9\x09\xf9\x16\x7c\x43\x85\x50\x9a\x0d\x4e\xfd\x78\xc0\xd7\xb0\x9f\xc1\x6b\x54\xc0\x6e\xe0\xb7\x10\xce\x07\x5d\x0f\x21\x74\xcb\xf9\x90\x89\xc6\x04\x3b\x0d\xfd\x43\x59\xbc\x5c\x2d\xb7\xc8\x94\x66\xb3\xd7\x48\x0a\x8b\x45\x32\xb0\xed\xf9\x60\x38\x73\x37\x9d\x99\x3b\xe3\xb8\x2b\x35\x05\x12\xfa\x23\x18\x38\x2b\xcd\xf9\x0a\xe4\xf0\x5a\xf0\xb7\x95\xde\x97\x66\x46\x4f\x48\x91\x73\x5e\x6c\x2f\xf7\x56\xc8\x8d\x87\x8b\x1d\xca\x81\x63\xdb\x76\xde\x29\x16\xf7\x11\xde\x0e\xbd\x30\x04\x30\xb6\xed\x6c\xa0\x53\xcb\x12\x99\xc8\xf5\xf7\x33\xae\x45\x06\x00\xf0\x16\x5d\xf3\xc5\xac\x33\xe4\xf8\x4c\x9c\x15\x94\xa8\xe1\x3b\x20\xd6\x89\x5a\xf0\x8a\x15\x5f\xb9\x9b\x91\xa2\x7e\xfa\x70\x61\x24\x71\x09\xbc\x32\xfa\x7c\xb3\x1a\xf9\x7c\xdb\x82\x20\x46\x73\x78\x6d\xdb\x57\xb6\xed\xf0\xea\xaa\x4d\xd3\xd5\xf2\x01\xd2\xd2\xf0\xee\x7b\x4d\x54\xd4\x95\xb0\xef\xfd\x04\xf7\x6e\xb5\x7d\xef\xc7\x5d\x08\xbd\xde\x1f\x6f\xeb\x65\xbc\x6e\xff\xf7\xba\x2d\xff\x87\x4c\x02\xaa\xd7\xeb\x5d\x46\xc7\xdf\x88\x78\xea\x91\xa2\x44\x5e\x9b\x57\xf2\x69\xc2\x49\xaa\xe8\x7f\x77\x9e\x46\x24\x16\xef\x11\xa9\x34\x68\xac\x40\xca\x59\x16\xe6\xfc\x94\xcb\xb7\x51\xb3\xed\xc1\x18\x25\x4e\xc4\x79\xea\xe3\x8c\x4e\x67\x31\x9d\xce\x98\xd4\x03\xdd\xd0\xdf\x88\xff\x02\x16\xa9\x92\x7d\x5c\x2f\xd4\xe5\x68\x3d\xe3\x2d\x1e\x7f\x9b\x0a\x61\x52\x30\x2c\xdf\x7d\x75\x18\x42\x70\x6e\x9f\x53\x6e\xa7\xff\xea\x15\x6c\xe9\x7f\x80\x05\x63\x21\xe5\x68\x56\xf0\x91\x26\x24\xf7\xdb\x9e\x4e\x9e\xa5\x0f\x7f\x25\x59\x2a\xad\x4e\xfc\x76\x4f\xa5\xff\xfc\xe9\x6d\x09\xf4\xf3\xa7\xf7\x7d\xfe\x95\xcf\xd2\x07\x29\x33\x5d\x27\x1f\x74\x4b\x78\x99\x88\x4e\x29\xcb\x4f\x27\x8c\x64\xe7\x64\x4c\xe7\x38\xf6\xfb\x70\x8e\xd7\x57\xcb\xf9\xbd\x52\x9b\xf9\xaf\x61\x4e\xa7\xef\xe8\x54\xf5\xd5\x54\x81\x7a\x70\x4f\xcb\xe6\xf7\xe0\x9e\x6a\xca\xb7\x1e\x66\x94\x11\x4b\xa8\x46\x6f\xe9\xf8\x9b\x1a\x4f\xfe\x29\x9a\xf5\x2e\x95\x0a\x30\xdf\x7b\x09\x85\x0b\x95\xf7\x78\xe1\xbf\x12\xcd\xfe\x92\xc6\x31\xc9\x78\x27\xd6\xa2\xab\x9f\x71\x96\x93\xcc\x97\x34\x1d\x46\x24\xa6\x73\xca\x48\xe6\x5b\xd0\x82\xe2\x39\x87\xdf\x87\x85\xfe\x89\x17\x9b\xa8\x25\x22\x3e\xaa\xef\x3b\xf8\x08\x94\xaa\x28\x01\xac\xa5\x11\xfd\xa1\x26\xd0\x7b\x05\x9b\x39\xb3\x18\x5d\x43\x24\xab\x7f\x5f\xe1\xab\x77\x5c\x3e\xb7\x70\x1c\x5b\x70\x46\x23\x72\xbd\x22\x59\x8c\x37\xd7\xc9\xa7\x74\x99\x93\xeb\xa5\x98\x87\x98\x4c\x49\x12\xf9\x56\x9a\xcc\x79\x6a\xba\x22\x99\x05\xb5\x34\x23\x3a\xff\x05\x27\x53\xf2\x19\x47\x7e\x0f\x6e\x8a\xdf\xf2\x72\x34\xc3\x0f\xa7\x6b\x92\x9f\x32\xbe\x1e\x38\xb0\x78\x6c\xfe\x41\x18\x16\xf8\xfd\x9f\xe0\x5a\x8c\xb1\xfa\xf6\x7e\x82\x1b\xf1\xad\x66\xf0\x27\x39\x0b\x34\x21\x6a\xaa\xee\x63\xa9\x06\x55\xa9\x12\xcc\x7d\x01\xa7\x19\x8d\x2a\x09\xc5\xec\xc9\x94\x57\xbd\x02\xc4\x58\xd3\x5e\xff\x27\xa8\xfe\x07\x16\x34\x76\xec\x27\xbe\x61\xfd\xb8\x10\x27\xd4\x5f\x91\x0c\x71\x42\xe7\x7c\x8c\xff\x9a\xa6\xf3\x5c\x2f\x60\xd1\xeb\x1b\x12\x93\x31\x4b\xc5\x82\xc8\xcc\x04\xd5\xbd\x97\xbd\x6a\x32\x1f\xbf\x1b\xb1\x1e\x55\xa3\xfe\xf7\x4f\xbd\x9f\xde\x9d\xbe\xb5\xf6\xc1\xde\xc9\xb9\x8f\xa8\xb8\x0c\x32\x97\x6d\x23\xa8\xc6\x77\xfa\xe3\x5b\xef\xec\x65\x0d\xa8\xdc\xdf\x95\xca\xa7\x19\xde\x1c\x84\x2c\x07\xd7\xdb\xaf\xd1\xc8\x74\x5f\x55\xb3\xdf\xa5\x19\x69\xa8\x4b\xcd\xe3\x01\xd0\x83\x95\xa9\x05\xff\x5a\x0c\xf9\x65\x52\x1d\x74\x79\xfd\xae\xd4\xfb\xc3\x65\x31\x79\xe6\x71\x0f\x1a\xc9\xa6\x52\xd9\x4c\x37\xb4\xfe\x21\x5c\xc4\xcb\x29\x4d\x72\x7f\x18\x42\xbc\x26\xb9\xff\xb8\xf6\x1f\x17\x74\x4d\xe2\xfc\x33\xc9\xc4\x02\xf3\x7f\xec\xd5\x57\xdb\xeb\x9e\x49\x3d\xb2\xb9\xd0\xc4\xfb\x63\x37\xc2\x8c\x9c\xee\x65\x40\xc1\x68\xea\x70\xbf\x54\x12\xc5\x3e\x7a\x9f\xd1\x48\xd0\x45\xb1\xa7\xa8\xa0\xab\x34\x89\x84\xff\x03\x92\x08\x7f\x15\x22\x4d\xb2\x26\x3f\x15\x78\x6e\xc5\xc7\x0e\x6e\xfc\xc7\xfd\x3d\x51\xeb\xc9\x8b\xde\x7e\x5b\x12\x41\x6c\x6b\xad\x69\xec\x9d\x84\x6c\xe8\xdf\x3f\xd4\xf6\x44\x1e\xb0\x44\xc6\x0e\x6e\xfa\xff\xff\x36\x5f\x37\xb9\xec\x8a\xd7\xd0\x7c\xef\x40\xf3\x77\xbb\xa0\x94\xd3\x16\xcf\xca\x69\x5a\x22\xf0\xff\x04\x9f\x14\x28\x7c\xaf\x0f\x1b\x24\x12\xdf\x7b\x7d\x50\xca\x6b\xf0\x61\xf4\x47\x1b\x4b\xfe\x21\x96\xc8\x4c\x19\x95\xf1\xb3\x14\xa6\x09\xc9\x10\xab\x98\x26\x8b\x63\x7c\xed\xf2\xbc\x5a\xc0\xa5\x49\x42\xb2\x0f\xb7\x9f\x3e\x22\xcb\x82\x92\x23\xb7\x91\xba\xa2\xc5\x8c\x8c\x44\x63\x6d\xbb\x96\xe0\x46\x84\x4b\x08\x1b\x6d\xc0\x56\xe6\x54\xad\xa1\x9d\x6a\x6d\x4a\x23\x96\x55\x1e\xca\x30\x49\x9a\x68\x9a\x34\xe8\xa8\xdb\x5e\xc0\x4a\xfd\x20\x41\x6c\xd8\x0b\xdd\x2c\x7d\xd8\xab\xb7\x82\xc8\xa9\xd7\x32\x6d\xac\x45\xfb\x07\x1a\x86\x90\xd4\xbb\x5c\x29\xe2\x08\x3d\x13\x39\xe9\x55\xed\x9b\x95\x9d\x44\xad\xa0\x34\x30\x18\xe9\x6b\x24\x69\x04\x8d\xcb\xd7\x3d\x14\x30\x79\xaa\x7a\xcc\xd2\x07\x9f\xc0\x71\x1a\x2f\xe7\x89\x4f\x3b\xde\xae\x10\xc4\xd9\xf7\x9a\xf9\x96\x47\x16\xbe\x6e\xff\x95\xde\x4d\xfe\x87\x19\xf9\x0a\x1b\xfd\x39\xde\xdc\x93\xdb\x8c\x60\x26\x05\xb5\xc5\x69\x7e\x16\x57\xfd\x15\xc9\x51\xc2\x7c\xa7\x4c\x2f\x92\xe8\x57\x94\x88\x9f\xef\x09\xfb\x75\x24\x6a\x84\x45\xde\x5d\x99\x77\x27\xf3\xd4\xf8\x08\xc5\x33\xbe\xcf\x9d\x12\x4d\x57\xfe\xbc\x61\x38\x63\xbf\xf2\xc3\xcf\x3e\xcc\x9d\x09\x73\x07\x02\x7a\xd2\xb7\xed\x94\xff\x53\x6c\x43\xe2\xc6\x38\x67\xeb\x91\x6d\x77\xbd\xb6\xf1\x95\xb9\x6c\xbf\x53\x0e\x81\xaa\xbd\x19\x99\xd2\x34\x91\xe6\x11\xb4\xf8\x96\xd2\x15\x12\xce\x51\x84\x19\xdc\x67\x9c\xec\x0d\x84\xba\x69\x0d\xb0\x4b\xf3\xcf\x38\x49\x68\x32\x45\xed\x5e\x20\xef\x00\x88\xbb\xe6\x14\x5e\xc8\x13\x6a\x4b\x94\xd7\xd9\xef\x52\xc1\x15\x8c\x07\x0c\xd0\x5a\x5b\x60\xe0\x60\x97\x26\x94\x51\x1c\x7f\x24\x13\x36\x4f\x73\x76\x8e\x19\x41\x89\x1b\xa7\x53\xaf\xa7\x5e\xa5\x61\xb1\x81\x04\x62\x23\xc7\x0b\x41\xb7\x02\x07\xfc\x03\xd8\x84\x13\x0b\x13\x09\x2f\xdc\xd5\xb8\xd7\x5f\x13\xca\x38\x03\xfc\xcc\x39\x21\x32\xe0\x8e\x1d\xe2\x2a\x59\x68\xa4\x0c\x98\xba\x1e\x80\x8d\x37\xfc\x38\xb9\x88\xa6\xe4\x9d\x62\x2e\x16\x28\x4c\xbb\x94\x62\xed\xe8\xbb\x4a\x89\x8b\x6a\x31\x8c\xea\xcd\x41\xee\xc8\x8b\x69\x96\x9e\xa7\xf3\x5f\xcf\xd2\x34\x8b\x9c\x98\x37\xbc\x9b\x0b\x5b\x83\x6a\xba\x17\x82\x4e\x0e\x23\x99\x8e\x19\x56\x19\x33\x69\xfa\x57\x49\x5b\x82\x00\xbb\xf7\x5c\x50\x24\x11\x1f\xa4\x1c\x0d\x23\x38\x96\x2a\x35\x65\x7e\x49\xb4\x75\xf9\xf7\xb5\xdd\x78\xd4\x41\x5c\x2e\xe7\x8d\xaa\xcf\x8f\x90\x4a\x1d\x52\x59\xcb\x04\x65\xe2\x09\x0c\x99\xcb\xd1\x86\x23\xdd\x9f\x3b\xd9\xc4\x09\x9f\x36\x0a\x3a\x53\x61\xb3\x59\xcd\xf1\x78\x4e\x77\x2a\x8c\x38\x65\xbf\x54\xd6\x08\x52\x20\x6c\x39\x2b\xa9\x2b\x48\x41\xb0\x10\x4f\x94\x36\x70\x1d\xee\x8a\xae\xab\x27\x1d\x0b\x69\x1a\xe5\xd2\xbc\x7f\xce\x17\x7e\xdb\x83\x58\xb4\x96\x8f\xc4\xef\xe8\xd3\x1c\x3d\xee\xe0\x3d\x22\xee\xa6\xdc\x0a\x14\x04\xc4\xc5\x8c\x65\xf4\x7e\xc9\x38\x86\x29\x61\x0d\xdb\x81\x82\x81\x33\xd7\xcb\xf7\x36\x5d\x88\x96\x15\xcb\xfd\x5e\x68\x03\xe7\x82\x24\x88\x9c\xea\x6e\xb8\xaf\xec\x86\x7b\xad\x21\xdc\x43\xc7\xe1\xf6\xb1\xf0\xd4\xae\x28\x04\xe7\xee\xb2\xb2\x1b\xea\xb0\xfb\x5b\x62\xc6\xb7\x84\x1c\x2c\xc9\xb8\xe6\x00\x66\xee\xaa\x28\x61\xdb\xe6\xb8\xf6\xc0\x8e\x53\x98\x79\xba\x22\x4d\x04\xe6\x9f\xa3\xb4\x8d\xbb\xbf\x7b\x90\xee\x1e\xd5\xf7\x7e\x6d\x47\x88\x2b\xc7\xe2\x0d\x12\x27\x95\x66\xae\x18\x63\xa5\xd4\xa2\x1d\x83\x6a\x08\xf7\x75\x35\x44\xd9\x9b\x5a\x61\x2f\xe4\xd8\xbb\x28\xeb\xee\x65\xc0\x1a\x3e\x00\xbf\x83\x8e\x12\x01\xff\x17\xe1\x80\x75\x84\x86\x85\x53\x99\xc4\xfd\x78\xfd\x7e\x74\x73\x76\xfa\xf1\x82\x6f\x8c\xc6\xf4\x0c\x84\x7e\xad\x3c\x85\x19\xa7\x98\x6a\xda\x40\x79\xd1\x7b\x80\x3f\xa9\xe7\x4d\xb5\x3d\x92\x1b\x97\xc0\x6a\x9f\xe4\xa1\x70\xc5\xc1\x3f\xf8\xef\x25\x4a\x8f\x66\xd5\x25\x07\x23\x54\xdb\x9d\x83\xda\xf7\x30\xd7\x3e\x6d\xd0\xac\xbe\xc2\x3b\xcb\x20\xb2\x6d\x67\x5c\x3e\x4d\x1b\x43\xe1\xf3\x0a\x28\xca\x36\xee\xce\x6a\x4b\x9a\x17\x58\x9c\x44\xe2\x06\xda\x19\x77\xd1\xa2\x1b\x49\x1f\x1d\xfb\xa0\x7c\x2a\x9e\xdf\xc9\x39\x18\xc4\xc6\x06\x38\x30\x1b\x8b\x03\xb3\x31\x06\xa1\x5f\x2d\xbe\x80\xe3\x70\x27\xa5\x75\xa1\x71\x1a\x39\x6d\x4f\x48\xb0\x24\x89\xf8\x26\x3a\x2c\xc9\x68\x5e\xfe\xd7\x34\x9d\x37\xec\x35\x9a\xf3\x0c\xc9\xc4\x21\x76\x7f\x4b\xd3\xf9\xa7\x74\x45\x22\xd4\xf6\xf4\x26\x3d\x50\xd2\x00\xed\xc1\x3f\x54\x3c\x92\x7b\xb3\x5b\xe2\xe4\xe2\x5a\x13\xcc\x5d\x09\x73\xc7\x79\x19\xff\x7d\x4e\x33\x25\xc5\xd3\x93\xec\xb8\x3f\x48\xdc\x5f\x2e\xbe\xdc\x5e\x9e\x9d\x7e\xf4\x13\xf7\xc3\xf5\x97\xcb\xbf\x5e\x5f\xdd\x9e\x7e\x84\x72\x30\x79\xdf\xbe\x90\x31\x1b\x39\xb5\xd2\xd0\x6c\x8a\xd1\x3d\x58\x59\xf2\x65\xf5\x10\xbb\x8b\x8c\xac\xce\x6b\x38\x78\x9a\x2a\xa6\x7e\xde\x01\x23\x19\x55\x10\x6b\x08\xf4\x34\x5a\x54\x6b\x2a\x9f\xa7\x06\x69\xef\x89\xd7\xa4\x4c\xac\x5a\x95\x5d\x5c\x4a\xf2\x42\x85\x85\x24\x17\xdf\x1b\xc1\xc4\xa1\xe5\xac\x06\x5b\xbc\x76\x14\xaf\x1c\xa5\x5e\xd9\xfd\x74\xfa\xeb\xe8\x97\xd3\x8f\x5f\x2f\x0a\xf7\x77\x39\x89\xa5\x42\x75\x54\xf1\x84\xa7\x9f\x00\x95\xd9\xc3\x98\xd3\x85\x62\x6f\x14\x86\xfa\xc6\x9a\x80\x7d\xd0\xd9\x03\xd8\x18\x0b\x02\xf6\x41\xa0\x2c\xcd\x96\xfc\x54\xd0\xf5\xc4\xe3\xee\xe5\x49\x0e\x84\xe9\xcc\x12\xa6\x28\x06\x3b\x65\x49\xdd\x20\xdd\x34\x5c\x0f\x58\xa0\xd3\xe7\xb4\x3d\x3f\x41\xd1\x51\x24\x1e\x65\x56\x9a\x9d\x86\x40\x5b\x9b\x8c\xd1\xe3\x18\x27\x63\x12\xe3\xfb\x98\x9f\x95\xa0\x18\x38\x3f\x83\xaa\x2b\xbe\xd1\x15\xfd\x02\xa3\x6c\xbc\x38\x0a\x31\x77\x8c\xf3\x31\x8e\xc8\xc5\x8a\x70\xf4\xe6\xe0\x5b\x70\xac\x2d\x11\x82\xc4\xb6\x13\x7d\x00\x22\x30\x93\x7d\xda\xab\x5f\xf8\x7b\x60\xea\x84\x00\x17\x2c\xf7\xcd\xa6\x7f\x6f\xb3\xf6\xdb\x34\xd6\xcd\xd9\x6e\xc5\xdb\xa5\xa2\x21\x45\x5d\x66\x3d\x9a\x68\x35\x12\x15\xf5\xd6\xae\xdc\x94\x00\x56\x28\x94\x07\x0f\xd3\x39\x85\x43\x51\x14\xc1\x2e\xd5\x33\x45\xc1\x8b\x8d\x13\xcf\x1b\xe4\xf5\x6c\xbb\x4e\x2d\x90\x49\x1d\xf4\x2b\xea\x82\x83\x1c\xa0\x06\x00\xe6\xa5\x74\x70\x08\x26\x48\x4b\x98\x14\x52\x77\x5d\x96\xa2\x89\x93\xf3\x94\x0e\x75\x1f\x84\x7d\x96\x6d\x13\x37\x4a\x79\x87\x7f\x1d\x09\x07\xe6\xe2\x25\x08\x9f\xc6\x2b\xb2\x66\xe7\xf7\xb1\x18\x6d\xd4\xee\xed\xb4\x2f\xf7\xea\xe1\xed\x60\xdf\x34\x11\xd4\xcc\xb8\xa9\x67\x26\x3d\xe3\x47\x8e\xa6\x9e\x55\x60\x82\xb8\x84\x89\x21\x75\x37\x65\x29\x9a\x38\x33\x9e\xd2\xa1\xee\x0c\xc0\xf8\x64\x56\xf6\xec\x6e\xe4\xc4\x70\x76\xb8\x67\xe6\x38\x2a\xcb\x3a\xa3\x7e\x24\x1f\x2a\x2a\xae\x76\x9b\x2e\xc7\xb3\xbd\x75\xc4\x04\xd1\x24\x09\x3b\x57\x4a\x26\x00\x99\xcb\x38\x28\x29\x9d\x09\x0b\xa1\x54\x22\xa1\x73\xf2\x2e\xcd\xce\xd3\xe5\x7d\x4c\x6e\xf1\xe2\x93\x7a\x20\x1f\xd4\xde\xdf\x4b\x9f\x39\x55\x3c\xe2\x21\xfa\xa3\x7e\xed\xa3\xf2\x86\x49\xa8\xfd\xa5\x3c\x2e\xf0\x94\xfc\xea\x67\xae\xf8\x0b\xf9\xbf\x77\xea\xeb\x0e\x46\xfc\x2c\xe6\xd7\x4e\x65\x0a\x14\x88\xdc\x3b\xbf\x76\x8a\x51\x45\xc1\x0e\xec\xc4\xe4\x17\xb2\x8f\xa8\x18\x51\xe8\xa1\xc2\xd0\x07\x14\xd9\x9f\x69\x32\x9e\x9d\x91\x84\x91\x4c\x58\x20\x42\x2c\x9b\x5a\x2c\x91\x1c\x3d\xae\x39\x91\xd8\xf8\xed\xde\xae\x88\x13\x60\x3c\x44\x14\xb2\xc2\x3e\x32\xd5\x3d\xf7\xd5\x91\x30\xc7\x95\x4d\xef\xd0\xa1\x17\xea\x5e\xc8\x1e\x57\x00\xee\x4a\x80\x3b\xa0\x06\xa1\x00\x10\x9f\x12\x40\xfc\xd4\xe3\x50\x01\xb8\x2b\x01\xee\xc0\x4e\x29\x1f\xbc\x9f\x7a\xc7\x62\xf1\x7d\xbe\x94\x1e\xca\x30\xc3\x49\xdf\x69\x6a\xb7\xac\xbb\x5b\xb6\x08\x96\xad\xef\x1e\x2c\x50\x6e\x65\x2e\x87\xa4\x00\xa6\x6f\xfe\xd4\x13\x4e\x33\xff\xd4\xeb\xa6\xa0\x79\x50\xd3\x93\xd7\x3f\xba\xaf\xe0\xc6\x4f\xdf\xf4\xfb\xee\xab\xdd\xae\x40\x2f\x45\xbb\xc7\xb5\x5f\xd5\x9a\xc0\x8d\x5f\x39\x3b\x96\xa7\xa5\xe6\xc5\xfe\xf4\x22\x36\xbc\x83\x54\x3c\x2e\xd4\x56\x31\x6d\x5a\xc5\xe2\x05\xd7\xb3\xab\x78\x27\xf9\x4d\x2a\x3c\x07\x57\x97\xa3\xf0\xc1\xb7\x3f\x98\x81\x70\x4e\x99\x68\xc7\xed\xc9\xb0\x17\xfa\xc6\x42\x4a\xca\x85\x94\x34\x2e\xa4\xa4\x5c\x48\x49\xb9\x90\x76\x2a\x02\x83\xc2\x94\xaa\xd9\x8c\x2b\x6d\x4e\xd5\xcc\xc7\xaa\xed\xc2\xe5\x8c\x39\x1f\xee\x9a\x1f\x84\xf7\xd2\x7a\xa1\x38\x93\x54\x52\x37\xc3\xde\x1e\xe4\x66\xe8\x85\xc1\x4c\xae\x5c\x34\x93\x55\x1f\xef\x69\x90\x8e\x96\x50\xc2\xdc\x29\x98\xbb\x3d\x98\xd9\x51\x24\x1d\x06\xc2\x85\xb2\x1c\xd6\xe3\x05\xc6\xc8\x83\x0b\xe4\x15\xbb\x34\x31\x77\xa9\xf4\x20\x98\x17\xe3\xa6\xfb\x1f\x8c\x91\x53\x8e\x66\x57\x8d\x0e\x38\x9e\x2a\x3d\x4c\x51\xa2\x18\x9b\x60\x61\x94\xb8\x53\x25\xee\xc0\xf1\x64\x67\x9c\xac\x7e\x82\x05\x03\x70\xbd\xfe\x2b\x2e\x94\xc0\xc5\xe1\xec\x85\x3a\x83\x8d\x50\xdb\x93\x7c\xb9\xb6\x63\xdc\xb5\x6d\x3b\xb5\x83\x68\x2c\x87\xb3\xab\x86\xb5\xe3\x34\xcc\x4e\x57\x01\x81\xe3\x31\x7c\x1e\xde\x33\xe1\x85\xc3\xfa\x5e\xc3\xee\x75\x37\xa0\xdc\x31\x5e\xb9\x45\x56\x86\xc6\x47\x28\x9f\xbe\x47\xb1\x13\x6c\xb6\x5b\x67\x55\x39\xd3\xc9\x26\xdc\xa9\x76\xde\xed\xb5\x73\x53\xf6\xeb\x0e\x1c\x2f\xe0\xf3\xf0\x9e\x09\xaf\xfa\x25\xed\xda\xab\x07\x47\x38\xe2\x12\x63\xc9\x08\x49\x93\xa0\xcf\xcf\x77\xa5\x88\x5f\x1a\x6d\x56\x34\xbc\xdf\x51\x52\x0a\x84\x04\x8a\x4d\xc4\xc7\x1e\x9a\xe4\x2d\x77\x80\x24\x70\x24\x89\x9a\xe9\x1b\x9d\x38\xe2\xc2\xa9\x46\xb2\x80\x29\x01\x68\xe1\x4f\x6f\x09\x8f\xc3\x8f\x67\xbc\x82\xe8\xb6\x5a\x4c\x99\xe4\x8b\x60\x00\xe7\x98\x11\xc0\x7b\xc0\x89\xa7\x23\x8f\x3c\xd5\x52\xc3\x5e\x18\x1c\x24\xb0\xb6\x4d\xbb\x07\x33\x4f\x5e\xf5\xa4\x24\xa6\x93\x7e\xb5\x6d\xf3\x0c\x5b\x24\x77\x13\x37\x1f\x67\x84\x24\xbf\x82\x93\x57\xd5\x22\x77\xcd\x45\xee\x8a\x22\x77\xbc\xc8\x80\xb8\x19\xc9\x89\x38\xe1\x3b\x42\x01\x7e\x88\x21\x50\x68\x56\x8c\x8a\x8a\xcd\xe4\x3b\x54\x22\xdf\x69\xd6\x5a\x9f\x13\x7d\x73\x73\x42\x06\xa4\xcb\x7c\xf6\x06\x0f\x58\x17\xfb\xbd\x9a\xe9\xbd\x7e\x89\x8b\x12\x77\x42\x93\xe8\x73\x9a\x3b\x44\x7b\x08\x01\x90\xa2\xc7\x98\x4c\x98\x8f\xdd\xb5\xb4\x07\xe2\xbf\x3a\x05\x80\x9b\x4e\x26\x39\x61\xf2\xf5\x1f\x4b\x17\x3e\x76\x37\x50\x3e\x0e\xe2\x3f\xf7\x00\xa5\x00\xbc\x83\x19\x67\xa9\x89\xa4\x6f\x0e\xe3\xec\x54\x7e\xdc\x89\xb7\x8b\x39\x4a\x9d\xcc\x5d\x43\x2e\xda\x4c\x18\xa4\xae\xa8\x19\xc0\x58\xa4\x6f\x20\x75\x59\xba\x80\xd4\x95\x15\x15\x17\x48\x05\x19\xcb\x61\x0c\x76\x41\x56\xb1\x64\x41\x8f\xc2\x9e\x27\x4a\x1f\x12\xbf\x61\xf5\xb6\x99\x7b\xbf\x64\x2c\x4d\xb6\xdb\x7e\x1b\xe9\x0f\x43\xa0\xa2\xbf\x11\x71\x96\x39\x4f\x1f\x74\x39\xc8\x5c\x1c\xb3\x9f\xc9\x66\xbb\x65\x6e\x3e\xa3\x13\xfe\x7b\x50\x5e\xcb\x28\x30\xdf\x50\xee\x54\x0f\x40\xb5\xab\x37\xe3\x18\x05\x1e\x73\x31\x35\x27\x5e\xaf\x37\x28\x35\x3c\x1a\xa3\x7a\xb5\x5f\x9e\x5f\x84\x9c\x5c\x6a\x77\x4a\x79\x5c\x6a\x74\xf8\xf7\xfe\xb9\x0d\xc8\xf3\x89\x71\x49\x64\xdb\x85\xca\x57\x55\x65\xbe\x27\x69\x31\x27\xad\xa8\xa3\x06\x7b\xed\x18\x14\xe7\x46\x27\xd5\x9d\x3f\x78\x18\x54\x10\xb5\xfa\xa5\xb2\x4c\x65\xc2\x44\xc5\xc9\x10\x27\x59\x27\x4a\xc7\x22\x60\x08\xb4\xc4\x64\xf2\x0c\x4e\xb7\x9f\x86\x5a\x2e\x2c\xc8\x84\x86\x4b\xdf\x76\xef\x02\xe2\xe2\x28\x3a\x4d\xa2\xdb\x0c\x8f\xbf\x3d\x8d\xfb\x79\x50\x5e\x41\xca\x09\xe4\x03\x8d\xe3\x73\x59\x89\x32\xb9\xff\xb4\x11\x91\xb2\xda\x3d\x28\x08\xa3\x58\x07\x7b\xcb\xaf\x81\x48\xee\x24\x3c\x6f\x44\x03\x78\x21\x67\x56\xa1\x49\x12\x35\x00\x6b\x9a\x5d\xc0\x46\xea\x18\xd7\xb4\x0d\x9a\x8e\x7b\xfa\x0a\x78\x95\xd2\xa8\x11\x00\xb5\x3d\xbd\xa2\x1f\xbf\x4b\x43\x01\x2b\x4a\x0f\x3e\x1b\x75\x7d\x85\x6e\x23\x9f\x01\xbe\xbb\xf6\xf7\xd9\x76\x5b\xa1\xa8\x82\x3d\x25\xca\xa0\x10\x8f\x19\x5d\x11\xb1\xed\x47\x4f\xed\xfb\xa7\x36\xf7\x0e\xaa\xb9\x7d\x62\x05\xf3\x3a\x79\x9f\x2e\xf9\xfa\xbd\xac\x59\xd4\xfd\xa3\x15\xc3\x3d\x02\xa2\x9a\xd2\xb8\x18\x9e\xd9\xbc\xba\x0f\xcf\x14\x53\x7b\x4e\x95\xfa\x7d\x56\x0b\x55\x9b\x9b\x7f\x65\x48\x88\xff\x61\xb6\x0b\x7b\xf6\x3d\x75\x7f\x62\xd2\xb4\x04\x0d\x43\xf9\xa9\x7d\x59\x14\x09\x22\x34\x1d\x96\x87\x54\x9d\xb6\x39\xe5\x42\x2d\x2a\x03\x1b\xad\x85\xd5\x95\x99\xb2\x31\x52\xaa\x76\x44\x38\x8a\xce\x31\xc3\x39\xa9\xbb\xe2\x30\x9a\x23\xcf\x92\x04\x54\xdb\x24\x53\xd9\xbe\x3d\x8e\xf6\x34\xd6\x10\xac\xa7\x70\xa3\x30\xaa\x96\x1a\xa7\xf3\xc5\x92\x91\xa6\x92\xd2\x90\xe7\x71\xed\xf7\xe0\xc6\xef\xed\x02\xe6\x3e\xd4\xfc\x4c\xc8\x4b\xfa\x2e\x73\xd7\xdd\x83\x0e\x28\xb4\xdd\xb2\xc5\x39\xf4\xac\xee\x90\x4c\x5e\x95\xeb\x25\x31\x9e\xe1\x8c\x8d\x22\xba\xaa\xf9\x89\x10\x7f\xce\xe9\x0a\x72\x1a\x93\xad\xc8\xcd\x02\x8f\xc9\x47\x2e\x09\x15\xcd\x2d\x04\xa7\xc7\xb5\xcf\xdc\x35\xdc\xf8\xcc\xdd\xc0\x07\x9f\xc0\x99\xcf\xdc\xd9\xae\xb0\x02\x72\xd7\x1d\x44\x20\x73\x1f\xba\x88\x40\xbc\xab\xa0\xfc\x22\x64\xaa\x43\x38\x3b\xbc\x10\x79\x02\x73\x13\xca\xdb\x74\xf1\x7c\x23\x99\xfb\x00\x67\x3e\x31\x50\x6d\x64\x23\x67\x0d\x18\xdf\x4a\x81\xee\x69\xa4\x1d\x5e\x96\x34\xa2\xd6\x38\xc5\x60\x73\xe1\x63\xff\xb9\x62\x63\xf3\x78\x5f\x77\xbb\xa0\xee\xbc\xae\xca\x2a\x94\xe7\x69\xa8\x97\xac\x58\x71\x88\xed\xd9\xa7\x9d\x1a\xbb\x69\x6f\x6b\x56\xb7\x9a\x11\x60\xee\xe0\x22\x33\x6d\xe0\x2d\xb0\xdd\x36\x19\x01\xee\x60\xcd\x05\xbb\xf1\xdc\x58\x12\xa3\x36\xa7\x22\xe2\xc9\x94\xb6\x17\x42\x08\xc9\x34\x93\xed\xb6\xb4\xd7\x05\x22\x63\x68\x19\x7d\x69\xcd\x97\x39\x6b\xcd\xf0\x8a\xb4\x70\xd2\xfa\x61\xfd\x43\x6b\xa1\x48\x96\x25\xb4\xea\x02\x19\x1d\xa7\x89\x6d\xab\xda\xaa\x84\xcd\xb1\xc4\x96\xe2\x5d\x68\xce\x96\x1b\xc6\x02\xe0\xa9\x06\x7d\xe2\x8d\xc8\x09\x6b\x09\x64\x2d\x9c\x44\x2d\x59\xae\xf5\x30\x23\x22\x22\x23\xa3\xc9\xb4\x55\x0e\xb3\x68\x92\xd9\xd4\xc4\x95\x8e\x8f\x1c\x0a\x05\x65\x85\x54\x0c\xcb\x76\xeb\xc8\x1f\x88\xf0\x1f\x00\xec\x91\x46\x49\x9a\xa8\x94\x00\x2a\x33\xfe\xab\x20\x84\xfb\x93\xad\x49\xe6\xfe\x1a\xb9\xe3\xd4\x75\xbf\x80\x22\xba\x35\x78\xa2\x3c\x54\xef\x3b\x07\x14\xa7\x6f\xf4\xb8\x53\x6e\x01\x35\xe0\x47\x3a\xa7\x86\xb7\xc0\x32\x59\xf9\x47\x6a\xce\x12\x8d\xdd\xcb\x31\x56\x80\x53\xa3\xca\xb5\xfa\xf6\xe9\x6b\x75\x4d\x57\x54\x05\x46\xfb\xdd\x39\x4d\xf8\xb8\xb3\x61\x4f\xf1\x1e\x9d\x8e\xd7\x32\xdd\x0b\x15\x15\xe5\x3f\xbb\x1c\xae\x52\x5e\xa8\x55\x90\x30\x80\x1b\x78\xc7\xc4\xf7\xe0\x81\xcd\x74\xc0\x56\xc2\xb6\x1d\x13\xdd\x3a\x4e\xa7\x59\xc5\x98\x66\xbf\x51\xa5\x69\xcd\x7e\x47\x00\xac\x63\x2b\x1b\xd8\x58\xcf\xc0\x3b\x6e\x4c\xf7\x3d\x10\xd4\x42\x2c\x94\x8b\xa4\x61\xa7\x1b\xb9\xc2\xc5\x80\x7e\xe2\x8a\xa8\x66\x85\x51\x69\xb9\x20\x4c\xa9\x78\x6f\x0e\x43\x78\x22\x00\x80\x1c\x8a\x02\xb4\x5b\xa0\xe5\x99\x65\xcf\x34\xe4\xc0\x3b\xd6\x3f\x0f\x4f\x84\xe9\xb6\xd8\xb6\x1d\xea\x6e\xf6\xc6\xbc\xa8\xb0\x1c\xea\xa2\x66\x11\x67\xa0\x32\xae\x06\x06\xd9\x80\x72\x0c\x21\xcd\xdf\x71\x21\x98\x98\xd5\x18\x51\x1a\x8c\xc4\xed\xb6\x46\x6d\xf0\x9a\xe6\x2d\xab\x83\x3b\x56\x2b\x9d\xb4\x44\x2f\x5a\x98\xb5\xac\x0e\x75\xa7\x1d\xab\x35\x16\x4e\x69\xee\x49\x2b\xa2\xf9\x22\xc6\x1b\x12\x71\x11\x2f\x4e\xa7\x2d\xd1\xb2\xd6\x24\xcd\x5a\x02\x73\x6b\xc8\x8b\xa8\xd6\x77\xac\x56\x57\xa0\x50\x1d\xec\x58\xa1\xa5\xd4\x5e\x63\x1c\x8f\x7f\x55\x91\x12\x0e\xa9\x59\xf0\xc0\x29\xd6\x5e\x39\x36\x44\x2f\x3e\x70\x44\xca\x35\xe7\x3b\xac\x5b\xe4\x1c\x11\xb9\x53\x74\x45\x77\x87\x2a\xe2\xc7\x33\xbd\xa6\xbc\x6e\x51\x1b\x31\x16\x7d\x31\x13\xe0\x88\x95\x53\xa1\x19\x71\x39\xe2\x60\x40\xfd\x2b\x7c\xa5\x3d\xe8\x79\x5d\x87\x74\xcb\xc2\xbc\x6c\xd1\xa4\x46\xba\xa2\x09\xd6\x13\xfe\xe9\x9a\x3d\x83\x55\x5e\xcc\x1f\xe4\xae\x07\x08\x02\x34\x76\x9b\x12\x56\xcd\xdd\x66\x98\x4e\x94\x10\x32\xd0\x49\x45\x96\xe5\x49\xe9\xe1\x46\x1e\x7a\xf7\x9d\x00\x58\x77\x2d\x77\xe8\x31\x7b\x02\x60\xdd\xcd\xdc\xbe\xfa\x59\xc1\x1a\x7d\x4c\x00\x9c\xa1\x5e\x30\x2b\x83\x33\xcf\x34\x15\x59\x22\x3a\x9c\x85\xc1\xd2\x5d\xa3\xea\x72\x74\x96\xf2\xc1\xb5\x41\xa9\x20\xd1\xae\x55\x97\xc2\xd1\x6b\xc0\x6c\xdb\x59\x96\xef\x6f\x51\x75\x9d\x39\x39\x94\x70\x3a\x1f\xc6\x00\xfe\x2f\x1d\x92\xb0\x88\x47\x08\xb6\x5b\x47\x63\x2c\x5e\xfa\x02\xfd\x22\x38\xb2\x6d\x27\x12\x4f\x84\xd3\xed\xd6\x91\x50\xfc\x13\x00\x8e\x7c\xbf\x46\x5e\xc9\xae\x3a\x42\x11\x66\xf8\x83\xf4\x75\x3d\xaa\xc7\x80\x70\x28\x14\x3a\xbd\x27\x16\x64\x8d\xd7\x2b\x5e\x57\x7a\x33\x15\x24\x5b\xb2\x7f\x26\x40\xf9\x89\x4a\xf8\x97\x30\x65\x02\xd3\xd5\x84\x5a\x9e\x2a\x67\xc8\x42\xe1\xf3\x42\x3c\xe7\x84\x19\x6a\x73\xc9\xf3\x9e\xc4\xa3\x95\x45\x93\x16\xe1\xa7\xd1\x6c\x40\xdc\x95\xaf\x40\x46\x2b\xe8\xd0\xda\x22\x60\xe9\x67\x92\x8d\x49\xc2\xd4\x2d\x72\x02\x80\xf0\xe6\x4f\x4f\x3c\xf5\x36\x43\xb6\x4d\xdf\xe7\xa5\xb9\x4f\xe5\xfb\x51\x1f\xc3\x19\xce\x47\x3c\xd7\xcf\x76\xa0\xec\xcc\xa6\xa9\x33\x55\x56\xc4\x0c\xcf\x81\x69\x85\x1b\xb1\x50\xd9\x03\xa6\xae\xac\xd7\xb0\x07\x24\x48\x25\x0e\xf3\x3f\xb0\xe3\xea\x82\x3c\x81\x0c\x80\x37\xa2\xe7\x48\x77\x7d\x63\x76\x5d\x7a\xee\x83\x87\x47\xe0\xc0\x4a\x68\x14\xf2\x8b\xb5\xa0\x7d\x36\x1a\x43\x65\x0a\x92\xc6\x78\x3d\x1a\x8f\x42\x0c\x90\x21\x0b\x03\x32\xc4\x62\xcb\x09\x3f\x0e\x58\x39\x4a\x09\x11\xde\x69\xb7\xe1\x0a\x9e\x44\xa3\xda\x01\xdf\x40\xa4\xfa\xbc\x5f\x3b\x28\xa9\x98\xb8\x03\xde\xa7\x75\xc5\x15\x57\x52\xa1\x73\x34\x34\xba\x96\xec\xf5\x25\x43\x09\x9f\xee\x14\x65\x65\xe3\x33\x37\xc1\x73\x12\xa4\x9c\x3b\x12\xdb\x76\x32\xa3\x3d\xd2\x55\x51\x63\x7f\xe4\x14\x65\x40\x78\x1b\xaa\x84\x21\xd0\x11\x8d\x95\x92\xa1\x32\x05\x11\x89\x09\x23\x2d\xa3\xc9\xd0\x4c\xd2\xc4\xb9\x9e\x28\xa9\xef\x47\xd1\x9b\x03\x99\xd7\xe2\x66\x21\xff\x3e\x9d\x4a\x1d\xe5\x7e\x86\x42\x27\x7c\x14\xfd\xe3\x7a\xb0\x86\xa8\x8b\x8e\x79\xae\xf8\x23\x94\x62\xc2\x74\x80\x4e\x9c\xf2\xbd\x17\x08\x9e\x0b\x75\x03\xcc\x98\xed\x8e\x35\x52\xd1\x98\xb9\xa4\x03\x1f\xf5\x97\xef\xf1\x2e\x34\xc4\x72\x2b\xbb\x40\x0f\x79\x4c\xf8\xfe\x57\x70\x7f\x84\x63\x02\xad\x0a\x4c\xff\x6d\x55\x81\xfb\xce\x12\x54\x76\x97\x8b\x04\xb9\x78\x4a\x92\x34\x38\x4a\x90\x5e\x14\xf3\x6e\x46\x26\x24\x23\xc9\x58\x06\x92\x75\x12\x67\x06\xe0\xb3\x9a\x45\x75\x60\xd5\x6b\x5b\x88\x05\xa3\xe2\x40\x2a\x49\x56\xf9\x3d\x8d\xd3\x7b\x2e\x70\xee\x4b\x2c\xb9\x0a\x58\xb0\xcc\x49\x56\xcf\x17\x69\x12\x68\xbb\xd5\xa8\xa4\xb3\x83\xb2\xe6\x9a\xb3\x05\x85\x43\x44\x48\x69\x70\xe1\x60\x81\x12\x53\x46\x44\x8c\x27\x25\x25\x81\x9d\x50\x66\x2c\xdd\xd3\x5f\x2f\x6f\x46\x37\xb7\x5f\x2e\xaf\xde\x8f\x3e\x9d\x7e\xfe\x7c\x79\xf5\xfe\x66\x84\x1e\x37\x7e\x0f\xde\xf9\x3d\xb8\xf1\xf8\x0f\xfe\xcf\xa6\xef\x7b\xf0\xae\xef\x7b\x3b\xb8\x14\x82\xda\x6d\x2a\xbc\x59\x8d\xea\x2b\xc5\xe2\x4b\x38\x99\x96\x21\xf5\x65\xf2\x81\xaa\xea\xea\x11\x56\xa8\x45\x0e\x14\xe0\x2c\x43\x46\x6f\xf8\x9a\x7c\x4b\xd2\x87\xa4\x25\x4e\x2f\x7e\xcb\xea\x30\xce\x32\x2c\xf9\x14\xb7\x5e\xbd\xf2\xdc\xe8\xf1\x3f\xe5\xe2\x95\x88\xce\xe5\x14\xe4\xad\x34\x89\x37\x3a\x0c\x44\xde\x62\x0f\x69\x6b\xd3\xc5\x6b\x92\xc3\x16\xe5\x5d\x25\x51\x6b\x92\xa5\xf3\x56\xaf\xeb\xb9\x96\x60\x4f\xe0\x50\x4b\x82\x22\xc0\x3a\x5c\x56\x28\xba\x31\x09\x07\x14\x09\x32\xdc\x8d\x98\x77\xa5\x71\x52\x8b\x52\xaf\x05\x56\xfa\x06\xab\x2c\xce\x47\xb9\x0e\xfd\x61\x08\xd5\x62\xf7\x1f\x77\xbb\xda\x92\x35\x72\xea\x8b\xb7\xae\xa5\x13\x0b\x52\xe5\x8b\x75\x64\x1c\x17\x54\x5b\x0e\x9d\xce\x55\xb6\x8e\x8a\x48\x43\x51\x3e\x43\xd5\x95\xe3\x24\xe2\x53\x69\x49\x54\x43\x86\x34\x44\x8f\x34\x5a\xfb\x18\x0a\x83\x09\x3f\x2b\x7a\x93\xec\xcc\x0e\x0f\xb3\x70\x50\xfd\x54\x28\xb4\x02\xcb\xaf\xe6\xa2\x62\x7c\x68\x65\x80\x76\xf2\xbd\x9a\xd1\x65\x3e\xe5\xbc\xc1\x41\xaa\x75\x68\x26\xa6\x5e\xe8\xaa\xd2\x30\x77\x37\x1c\xae\x32\x0f\x86\x85\x49\x63\x71\xaf\x52\xbc\x2f\xcb\x57\x21\xe5\x5c\x19\x60\x6b\x01\xb5\xab\xae\xa5\x29\x61\x4d\xde\x6c\xd5\x12\x7a\x2f\x68\xd0\x57\xde\x1f\x87\x15\xb4\x54\xdd\x2f\x93\x01\xf1\xab\x80\xca\x66\x74\x24\xae\x24\x6a\xb5\x18\xa8\x1a\x9f\x66\x97\x03\xb7\xb7\x97\x07\x65\xe6\x90\x85\x2a\xdc\x46\x23\x7a\xdd\x80\x83\x35\x28\xa2\x7a\xa8\x0e\x95\xcd\x6b\x29\x3d\x6f\xec\xc3\x16\x79\x07\x9b\xa3\xce\xca\xcd\xbe\xd5\x83\x26\x02\x43\x00\x46\x04\x52\xc4\x49\x0c\x1e\x58\x1b\xcb\xb7\x36\x7d\xab\x08\x52\x60\x6d\x3c\x0b\x21\x22\xde\x69\x5b\x1b\x0b\x40\x6b\xc3\xbf\x01\xdf\x4d\xda\x74\x87\x17\x90\x69\x5e\x59\x6e\x6d\xb5\x11\x69\xa2\x30\x56\x87\x04\x18\x75\xbd\x1d\x45\x64\x27\x25\xd7\xae\xc7\xeb\x36\x56\x8f\x5f\xd7\x92\x4d\x9c\xa4\x90\x5c\xf5\xd2\xe2\xa9\xd9\x61\x0a\x9c\x0d\x99\x88\xe8\x20\x5a\x82\xc8\x76\x5b\x9e\xad\xdb\x85\xe7\xf3\xf4\xd0\x92\x2b\xa3\x86\xa6\x1a\x61\xaa\xf6\x5a\x39\x43\xe2\x3d\x14\x0d\x8b\xa8\xe7\x0d\x53\xc6\x0f\x09\xbf\x63\xb5\x16\x9a\x80\xda\x0c\xd2\x89\x43\x10\xda\x57\x53\x7c\xa8\xb2\x4d\x07\xa8\xa3\x44\x9d\xd3\x1e\x1e\xa6\x46\x70\xce\xa6\xc4\x7d\x84\x41\xda\xea\x28\x08\xa8\xcd\xae\x22\x50\x62\x82\x8d\x03\x93\xa6\x8c\x2a\xf0\x80\x9e\x3c\xad\x85\x6a\x18\x33\x6a\x8e\x99\xd6\xfe\x30\x88\xa5\x0d\x5a\x6d\xd0\x92\xe5\xbc\xaa\xa6\xaf\x6e\xbc\x0a\x59\xab\x96\xe4\xab\xb1\x69\xbc\xab\x08\xf2\x62\x44\x64\xf5\xfb\x38\xa4\xaa\xe8\x30\x86\xe2\x78\xad\xfb\x5e\x45\x21\x2b\xd8\xdf\xb8\x87\x90\x48\xf8\x26\x1c\xf2\x6c\x73\x60\x20\x14\x53\xdb\x95\xfe\x20\xa8\x79\x3e\x58\xfe\xfe\xf3\xc1\x41\x21\xd6\xf7\x7a\xf0\x49\xd9\xd5\xf7\x5e\x36\xba\xe9\x80\xd5\x23\xc7\xbf\x28\x4c\xec\xff\x6c\xeb\x81\x52\x87\x55\xcc\x6f\xaa\x52\xf7\xd7\x4e\x95\xe4\xd9\x36\x15\x34\x87\x97\xdd\x05\x58\x3b\x6a\xf9\x48\x13\x82\x33\xa9\x31\xcb\x1a\xad\x07\x65\xe8\x27\xf5\x36\x5e\xc5\xd0\x1f\x23\xea\x58\x55\x2f\x34\xc2\xed\xa9\x8c\x1b\x98\x8a\x21\xd1\xea\x24\x43\x91\xa4\xc2\xbc\x3c\xae\xfc\x74\x98\x87\x3b\x50\x30\x0c\x6a\x5e\x37\x80\x47\xf5\x94\x6c\x12\xa7\x69\xe6\xe0\xe3\xb1\x9c\xbc\x29\x4a\xdc\x7b\x9a\xe0\x6c\x73\x43\x70\x26\xac\x98\x22\xe8\x01\xe1\x57\xbd\x92\x4e\x60\x04\xbb\x1e\x08\x38\x67\x99\xda\xb6\x33\x45\x3d\x00\xf9\xc7\xc4\xb6\x9d\x09\x8a\x0a\xbf\xaa\xda\xb8\x59\x9f\x9e\x27\xdd\xe9\x1b\xb4\x3c\x7e\x59\x2a\x90\x57\x68\x12\xac\xde\xa0\x69\xb0\xd2\xbe\x54\x37\x28\x1a\xae\x42\xb8\x96\x4d\x8c\xd3\xa9\xb3\x39\x66\xe0\xb8\xf8\x22\xc7\x0c\x1c\x61\x38\x47\x8f\x2b\x7f\xb3\x0b\x94\x52\x74\x34\x18\xa1\x47\x46\xc7\xdf\xc4\xe5\x8d\xbf\x91\x2e\x7c\x46\xe3\x34\xcd\x22\x7f\xbd\xf3\x0b\xb3\xd1\x75\x77\xe4\x1a\x79\xe0\x0d\x1a\x3f\x53\x74\x2e\x77\x37\xb2\x2c\xb8\xd0\xaf\xb9\x77\x0b\x37\x23\x2b\x92\xe5\xe2\x39\x82\x3a\x43\x2c\x2a\x26\xb5\xf7\xf0\x01\x9e\xf2\x69\x2c\x9d\xd2\x59\x20\x38\x1d\x38\xf7\x68\xe8\xc1\x3e\x7c\x09\x7f\x82\xde\x6b\xf8\xa2\x0f\x5f\xbf\x14\xce\xc2\xfa\xaf\x5e\x87\xf0\x01\x79\xaf\x81\xaf\x61\x5e\x41\xaf\x07\xfb\x3d\xf8\xaa\x07\xbd\x5e\x4f\xe4\xf6\x80\x76\xc3\x0a\x2f\xe0\x47\x39\x48\x63\x42\x63\x31\x8d\xf0\xb6\x7c\x8e\x41\xba\x0c\x1c\x7f\x84\x37\xe6\x54\x17\x83\x78\x6b\x0c\xe8\x03\x00\xf0\x73\xf9\xb6\xf0\x01\xde\x48\x9d\xa7\x7c\xa4\x78\x5f\xfa\x92\xb9\x46\x9f\x8f\xee\x87\x71\x08\xcf\x4d\x9c\xec\xf8\x1a\x1c\x5d\xc3\x0b\xa3\x29\x44\x26\x2d\xcb\xc6\x5c\x74\xcf\xc1\xf1\x35\x6c\x3b\xf8\x78\xf9\x66\x0c\x80\x78\xe7\x28\x6a\x39\x7f\x73\xc1\x51\x1f\xa1\xae\x07\x74\x40\xc8\xa5\x58\xcc\x33\x74\xde\xc9\x8f\xae\x61\xb9\xa8\x67\x3b\xe5\xdd\xfb\x8c\x8f\xeb\xbe\xb3\x25\xe5\x6f\x41\x62\x59\x98\x1b\xa3\xb8\xef\x5f\x0c\xf3\x50\xce\xa7\x6d\x3b\xe5\x07\x3a\x93\x64\x23\x83\x22\x6d\x05\x7b\x7c\x57\x16\x71\x24\x5b\x0b\x63\x47\xcb\xbd\x9c\xaa\xa8\xaf\xcd\xb4\x43\xee\xf3\x71\xe1\x88\x58\xe3\x49\xdf\xa0\xde\x60\x2a\x92\x53\x11\x1b\xc9\x1f\x86\xc2\x87\x53\xe1\x50\x0b\xe5\x2a\x74\xce\xe3\xa7\xcb\x8f\x1f\x2f\x6f\x2e\xce\xae\xaf\xce\x3f\xf2\xf3\xf6\xed\x5f\xae\x47\xd5\x34\x0f\xbe\xbb\xfc\xe5\xa2\x96\xd8\x87\xb7\x17\x57\xb5\xb4\x17\xf0\xdd\xe5\xbb\xdb\xbb\x5a\xea\x4b\xf8\xe1\xeb\xd5\xf9\x97\x8b\xf3\x5a\xfa\x2b\x89\xb6\x39\xf3\x35\x2c\x7e\xfe\x28\x9a\x54\x7c\xfe\x24\x8b\x15\xdf\x7f\x12\x0d\x29\x1b\xdb\x83\xb7\x1f\x2e\xbf\xdc\xde\x19\x49\x1e\xfc\x74\x79\xf5\xf5\xf6\x82\xff\xee\xab\x0e\xea\xef\x17\xba\x73\x3a\xe1\xa5\xea\x98\xfe\x7e\xa5\xf1\x95\x49\xaf\xe1\x87\xeb\xaf\x5f\xf8\x2f\xd9\x36\xfd\xf5\x13\xbc\xb9\xfc\xb5\xf8\xfa\x13\x3c\x3f\xbd\xe4\x23\x25\xc7\x54\x7d\x78\xf0\x2f\x17\x17\x3f\xf3\x5f\x7d\xf8\xe9\xfa\xea\xf6\x03\xff\xf9\x02\xfe\xf9\xeb\xe9\x97\xdb\x0b\x5e\xae\xff\x12\xbe\xbd\x3c\xbd\xba\xfa\x7a\xfa\xd1\xef\xbf\x82\xfa\xd7\x6b\x78\x7e\x71\x76\x7a\xce\x7f\xfe\x08\xcf\x2e\xae\x6e\x2f\xae\xae\x2e\xf9\xd7\x4f\xf0\xea\xeb\xa7\xd1\xfb\x2f\xa7\x57\x5f\x3f\x9e\x7e\xb9\xbc\xbd\xbc\xb8\xf1\xfb\x7f\xe2\xb3\xfd\x3e\xc3\xc9\x32\xc6\x19\x65\x1b\x14\xeb\x57\x3a\xe7\xa7\xb7\x17\xef\x2e\x2f\x3e\x9e\x8f\xf8\x64\x97\x5f\x9f\x7c\xcf\xf8\x3a\xf7\xfb\xc6\xd7\x87\x0f\xfe\x0b\x13\xf4\x93\xff\xd2\xf8\xbc\xb9\xf1\x5f\x99\xb9\x37\xfe\x6b\xd1\xa4\x22\xe9\xc6\xff\x71\x07\x97\x9c\xa9\x2c\x87\xb1\x5b\x99\xe7\x10\x3d\xf2\x35\x39\xa1\x24\x8e\xfc\x99\x6b\x62\x11\x1e\x1a\x7d\x0f\xe6\x0b\x3c\xa6\xc9\x54\x68\x7d\x86\xb1\xbb\xb7\x3c\x9f\x45\xd1\x2f\x50\xf4\x25\x8a\xfd\xd5\xfc\x2c\x8e\x57\x05\x8e\x57\xaa\x19\xf5\xc5\xff\x7c\x4f\x7a\x65\x57\x7a\xba\x21\x7b\xbb\xe5\xf9\x96\x94\x68\x5e\x29\x34\x8d\x3b\xe8\x3b\xda\x63\x36\xa8\x67\x0c\xcd\x3f\x86\xef\x55\xcf\x6c\x99\xc2\xf7\x6c\xe9\x9b\xfd\x79\x26\x2f\xca\x99\xfe\xee\xf2\xc6\x24\xeb\xf2\x15\x32\xf1\x2c\x02\x63\x86\x8b\x06\x18\x74\xe5\xf9\x0e\x18\xa3\x49\x5e\x2a\x04\x55\x42\xf4\x2c\x8e\x17\x25\x8e\x17\x1a\x87\xa6\x3a\x87\xc7\xff\x53\x7d\x04\x5f\x17\xf5\x1b\x94\xee\xd9\xf2\xe5\x08\x7a\x7d\x8d\xa0\x42\x1a\x9f\xc5\xf0\xca\x68\x7d\x65\x9b\x7c\x6f\x0f\x7a\x46\x17\x5e\x55\x86\xf0\xbb\x71\x18\x43\xe8\xfd\xa4\x91\x48\x8a\x7c\xb0\xec\x87\x0f\xf5\x11\x7c\x51\xd6\x5f\x90\xf7\x67\x8b\x97\x03\xf8\x63\x5f\x17\x2f\xf9\xc1\xb3\xc5\x5f\x97\x2b\xd8\x2b\xaa\x17\x4c\xe3\x60\xd1\xf3\x7a\xbb\x7f\x7a\xfd\xd2\x6c\xf8\x77\x95\x36\xe6\xfd\xc7\x7e\x31\x64\x92\x49\x3d\x57\xf6\xc7\x72\xc2\x7a\x2f\x8b\xb2\x8a\xad\x1d\x9e\xab\x7a\xb3\xfb\xaf\xfb\x7f\xfa\x89\xd7\xae\xa8\x46\xc1\x0c\x9f\x43\xf1\xa2\x3a\x66\x47\x2f\x5e\xbf\x72\xfb\xaf\xfa\x6a\xf5\x6a\x36\xfa\x1c\x96\x72\xe4\x5f\xbe\xe8\xef\x61\x79\x06\xc7\x5d\xe3\x1c\xd4\x70\x28\xd6\xfd\x2c\x12\x63\xff\x7b\xaf\x5e\xfd\xf8\x53\xef\xc7\x17\xaf\x35\x29\x2d\x79\xfe\xf3\x68\x9a\xf0\x90\x17\x3b\x65\x43\xd2\x68\xe1\x23\x5c\x2d\x76\x5f\xfc\x29\x20\x27\x88\xff\x6b\x58\x18\xe0\x52\x6a\xf7\x7a\x90\x00\x48\x91\x17\xd0\x13\xf4\x27\xf3\xe2\x1a\x1f\xd1\x40\xb9\x4f\x4c\x8a\xa0\xf6\x6c\x27\x42\x9f\xee\x07\xcc\x30\xa2\x63\x34\x1c\x40\x65\x78\xfd\xd8\xdd\x13\x6c\x64\xa4\x7d\x3a\x71\xf0\xf1\x42\x39\xdd\x78\x83\x92\x42\x59\xa8\xaa\xed\x7a\x3b\xb8\x68\x76\xa0\x87\x96\x43\x1c\xba\x6a\x70\x2a\x8f\xcc\x64\x78\x1a\xef\x48\x1e\x68\x28\xd8\xc1\x69\xc3\x01\x5a\x8b\xdc\x07\xce\x05\x30\x2f\x4f\x62\x5f\x6f\xcf\x2c\x00\x23\x94\x0f\x12\xf7\x1c\x33\x72\x3a\x1e\x93\x3c\x4f\x33\x9e\xe1\xd7\x92\x3e\xa6\x63\x1c\xc3\xb1\x6c\x5d\x31\xb7\x70\xa1\x9a\xcb\xc8\x02\x4e\x2b\x4d\xe7\x87\x65\xf5\x90\xd2\x61\x00\x8e\xb8\x70\x35\x1a\x56\xd6\x42\x88\x22\xf9\x48\x34\x8e\xef\x08\xce\x9c\x09\x80\x55\x88\x4f\x0a\xe2\x53\x9a\xb0\xd9\x7e\xf6\xb9\xca\x16\x75\xec\xe5\x7e\xf8\xa0\xb2\x3f\xa4\xcb\x2c\x6f\x40\x5e\x60\xa7\xc9\x92\x91\x06\x88\x9b\x1b\x05\x71\x43\xc6\x69\x12\x35\xe1\xb8\x29\x70\xc4\x31\xcd\x0b\x30\x15\x5d\x79\x34\x1c\x87\xff\xb9\x08\x30\x42\x9a\x5c\x89\x20\x19\xaa\xd1\x1b\x67\x02\x38\xc2\x71\xd8\x45\xab\xe2\x5e\x69\x83\xc6\x1d\x2f\xd8\x9c\xcc\xdc\xaa\x84\x1a\x6c\x3a\x1d\x30\x1a\x6e\x42\xb4\x11\x81\x83\x8d\x61\x18\x78\xbe\x74\xb3\xb8\xe6\x7b\x64\x8e\x22\x77\x8e\xbf\x11\x3e\x2a\x2e\x5e\x2c\xe2\x8d\xd0\x1f\xc1\x11\x80\xf7\x68\x5e\xbe\x69\x15\xaf\xac\x4f\x90\xe6\x3d\x62\x2f\xdd\x9f\x30\xdb\x76\xee\x3b\x68\x0a\xe7\xe5\xf4\xdd\x03\x10\xdc\x9f\x20\x12\x80\x75\x71\x02\xbd\x57\x06\x32\xa9\x3e\x2e\xce\xd5\xf2\xdb\x01\xb8\x5f\x5e\xea\xf0\xcb\x1a\x78\xa7\x3b\x68\xf1\xdd\x6d\xd5\xf5\x3b\xf8\x0d\x52\x2c\x67\xbb\x35\x26\x77\x0e\xfe\x73\x81\x50\x0f\xd8\xf6\xf7\xb5\xf0\xf7\xd6\xaf\xf7\xe1\x9a\x1f\x5a\xd4\x8a\x13\x7a\xd4\xe9\x13\xd6\x18\x3f\xfe\x8e\x78\x0f\xda\x3b\x89\xf1\xa2\xf0\x23\xcd\x19\x49\x48\xe6\xf0\x8d\xdd\xf6\xc0\xae\xd9\xda\x01\xb1\xed\xf6\x41\x3c\x88\x77\x85\x63\x13\x11\x1b\x2a\x5d\x7c\xce\xd2\x05\x9e\x0a\xab\x1a\xdb\xde\x4b\x12\x6e\x4f\xaa\x9e\x50\x38\x54\x83\x6f\x14\xf9\x68\xee\xed\xf2\xfe\x3e\x26\xa8\xdd\x2b\x52\xe4\x6f\xd9\x08\xe9\x3d\xb0\xed\xc1\xb6\x57\x36\x32\xab\xba\x05\x4d\x60\x16\x28\xed\x10\x01\x14\x61\x98\x20\x0c\x33\x33\xa6\x59\x6a\xea\x52\x5e\x1f\x31\x4e\xaa\x5e\x1f\xb1\x6e\x0a\x63\x84\x8f\x1c\xaf\x4b\x00\x9c\xa9\x5f\x47\x39\x80\x4b\xfd\xdb\xf1\xba\x39\x00\x41\xfe\x40\xd9\x78\xe6\xa4\xe0\x71\x8c\x73\xd2\xf2\x7c\x8a\x66\xaa\x96\x38\x90\xf1\xb7\x45\x46\xdf\xa7\x28\x56\x19\x4b\x33\xe3\x85\xca\x98\x89\x76\x19\x19\x2f\x7d\x8a\x96\x30\x41\x71\x3d\xe3\x95\x2f\x7b\xc2\x33\x66\x66\xc6\x6b\x5f\xfc\xe9\xa9\xfc\x25\x6f\xc3\x4e\xb3\x1c\x6a\x76\xb4\xff\xea\xd5\x11\xed\xb8\xaf\x00\x4c\xea\xc9\x89\x48\xce\xea\xc9\x99\x48\x16\xde\xf5\xad\x0e\x15\x36\x55\x89\xb4\xac\xea\x58\xc0\x2a\x27\x20\x35\xa3\x77\x8a\x48\x43\xcb\x24\xa2\xc9\xf4\x2c\xa6\x24\x11\x0f\x62\x1c\x00\x31\x92\x6b\x07\x52\xa4\xdf\x97\xba\xfa\xc7\x85\x0c\x8c\x1c\x14\x6f\x65\x88\x78\x19\xdd\x71\xb0\x7c\x42\x2d\x6d\x96\xb6\x5b\xea\xe6\xe3\x2c\x8d\x85\x5f\x45\xe9\xa3\x84\xa5\x0b\x0d\x75\x57\x87\xba\x4d\x17\xc0\x08\x5c\x92\x97\x6b\xb9\xcd\x24\xde\xed\x56\xfd\x38\xe9\x0d\x7a\xbe\xfa\x5d\x96\x88\xf7\x4a\xdc\xe9\x12\x77\x46\x89\xbb\xb2\xc4\x4c\x5e\x6e\xe9\xeb\x33\x87\x81\x2e\x71\x17\xeb\x12\x60\x59\x01\x88\x15\xc0\xa6\x04\x88\x8c\x3a\xdb\xac\xb0\x17\x67\xc6\xa6\x1c\x9b\x38\x04\x90\xbe\xd9\x63\xc2\x30\xd5\xfc\x5e\x1b\x7e\x7a\xc5\x97\x01\x5a\xc9\xda\xd8\x76\xdb\x51\x75\xb9\x6b\xb0\xdd\xb6\x89\x6d\xeb\xef\x0d\xe0\xff\x95\x2d\x58\x98\xef\xea\x0b\x47\x1b\xc5\xfb\x74\x0f\x92\xed\xb6\x0f\x60\xdf\xab\xbe\x5d\xc7\xf7\x7c\x44\x4e\xdc\x5e\xcf\xb3\x6d\x51\xed\x80\xb9\x2c\xbd\x58\x2f\xd2\x84\x24\x8c\xe2\xd8\xc1\x5d\x0f\xf8\x3c\xf1\x73\x46\xc6\x34\x97\x51\xfe\xca\x8a\xa7\x26\x3d\x3a\xf1\x7a\x03\xab\x67\x75\x98\x6f\x59\x1d\x56\x02\x4d\x4a\xd1\x4a\x8a\x55\xbc\x54\xc7\xf2\xad\xce\xd4\x21\x92\x19\xf1\x71\xe8\x20\x99\x84\x01\xa4\x40\xdf\xc5\x5a\x56\x87\x06\x3c\xcb\xb5\x3a\x8e\xd5\xeb\xf5\xac\x4e\x06\xdc\x7c\x79\x2f\xad\x68\x9c\x4c\xeb\x9b\x77\x45\x18\xba\xa2\xde\x91\x39\x2a\x64\xc0\x98\xff\x1f\x90\x56\x44\x93\x04\xe1\x8a\x18\x22\x6e\x42\x70\x29\x77\x50\x00\x53\x54\x90\x7d\xfe\x99\xcb\x4f\xc9\x7b\x28\x10\xce\x6c\x0c\x41\x82\x0a\x42\x65\x0a\x0e\x54\x90\xab\x3d\x41\x81\x72\xe9\xcb\xb2\x3a\x09\x1c\xa3\xa9\x93\x75\x3c\x00\x17\x68\x2a\x63\xb6\x72\xb1\xfa\x28\xef\xbc\xee\x1d\xc5\x9d\x59\x87\xcf\xce\xd1\x12\xae\x50\xd4\xb1\x8e\xad\xce\x58\xfc\xbb\xd0\xf3\x38\xe2\x62\x45\x07\x59\x2d\xab\x33\x71\xd4\xcd\x09\x00\x70\x55\x8e\xc2\x6a\x6f\x6d\x14\xb2\x72\x83\x8c\xc9\x8e\x30\x38\xc6\x65\xe9\x4d\x73\x0c\xfb\x76\x2f\xc8\x82\xe2\x82\x1b\xe6\x88\xf0\x91\x80\x33\x44\xe1\x12\x25\xe2\xde\x9c\x73\x05\xb5\xb6\x67\xc6\xca\x9e\xc9\xe0\x96\x6d\x84\x96\x46\xea\x52\x44\x3b\xef\xc1\x25\xca\xcb\x8b\x13\x38\x7b\xb3\x04\x5a\x6a\x0e\x54\xa9\xd8\x28\x15\x6f\xb7\x4e\x8c\xd4\x6d\x40\x54\x91\xe5\xcb\x55\x29\x2c\x9e\x59\x11\x31\x9d\x4b\xdf\xc2\xc8\xe8\x32\x61\x8e\x33\xeb\x2c\xc1\x71\x1f\x7a\x3d\x00\xa7\x28\x1f\x2e\xc4\xd5\xd2\xd4\xb8\x92\x17\x8e\x76\xa6\x6f\x52\x21\xd8\xc7\x6f\x7a\xc2\xee\x7c\xd1\xf5\xe0\xd8\x89\x80\x6d\xe7\xc3\x28\x3c\x49\x41\x09\xcd\x50\x0a\x09\xca\x21\x46\x31\x94\x5c\x88\x03\xf3\x01\x83\x63\xb4\x40\x53\x14\xa9\xa0\x64\x3b\x7d\x2d\xd5\x76\xa6\x25\x86\xae\xf0\x80\x13\x9f\xa8\x7a\x3a\x66\x3d\x6f\x0e\xd7\xc3\x01\x25\xaf\xd9\xaf\xc7\xa0\xb8\xeb\x82\x2f\x40\xcc\xeb\x11\xee\x0f\x99\x9b\xcb\x1b\x2d\xab\x6b\x81\xed\xb6\xeb\xb5\x8d\xa4\xdb\xfd\xa4\xbf\x5a\x00\xd8\xb6\x83\xd1\xdc\x61\xa0\x7c\x40\x83\x8b\xc6\x09\xd4\xd5\x32\x5d\x4b\x85\x80\xe5\x0c\x29\x23\x8b\x18\x8f\x09\x4f\x85\xd6\xb1\x05\xad\xa9\x05\x02\xe9\xa9\xdc\x80\x0f\x00\x41\xa4\x0e\x0b\x02\x5e\x2d\x51\x8e\x24\x7e\xe2\x8d\x57\xfe\xa2\x04\x66\x49\x16\x9c\x1e\x7c\x09\xc4\x2e\x29\x52\x5e\xc2\x7e\x2d\xe5\x35\xec\x73\x16\xc8\x91\x01\x5f\xf6\x45\xef\x06\x6c\xf4\x69\xef\x29\xd0\x59\xba\x8c\xa3\xe4\x07\xd6\x12\x6b\xa8\x65\x75\x58\xc7\x6a\xe1\xbc\x85\x5b\xfc\x64\x64\x01\x68\xec\x9d\xb9\x19\x28\xb9\xa4\x3a\xa5\x6c\x59\x82\xde\x17\x46\x18\xa5\x17\xf7\x62\xa3\x90\xea\xed\x2f\x01\xf5\xeb\x5e\x47\xdc\xf3\xb2\x21\x0e\x45\x54\x59\x23\x1e\x40\x51\xc1\xc3\x1f\x50\x81\xba\x66\xe4\x55\x0c\x44\x65\x3c\xc1\x3f\x15\x17\xcc\x60\x50\x54\xaf\xcc\xef\x80\xdf\x6e\xb8\x2e\x4e\xc5\xc5\x75\x69\x1c\x74\x95\x46\x64\xc0\x5a\x34\xc9\x19\x17\x2e\x55\x8a\xbf\x07\xc7\x6c\x7b\xdf\x72\xd1\x4d\xd2\x88\xdc\x6e\x16\xc4\xb6\xf7\xad\x2a\x45\xe6\x15\x9e\x93\x9d\x6c\xa0\x6d\xef\x21\x15\x3d\x71\xf6\xeb\x1a\xe2\xb0\x18\x1b\xfe\xb1\xdd\xca\xc1\x7d\xdc\x01\xf8\x20\x7e\x42\x81\x12\xf8\x4f\x8e\xf9\xa9\x21\x86\x29\xcc\x0a\xca\xa8\x93\x6c\xb7\x96\x2e\x21\xed\xa0\xcc\xcf\xa2\x33\x94\x91\x39\x28\x1b\xd5\x38\x1a\xfa\x92\xf2\x85\x10\x20\xf4\xd8\x94\xed\xb9\x7e\x62\x1e\x58\x05\x77\x53\x0b\xd4\xaa\x2d\xd1\x9d\x73\x74\xa5\x4d\xa4\x88\x0b\xbd\xf7\xfa\xf8\x54\x0c\x17\x18\xa8\x20\xb9\xe7\xf2\xb3\x08\x21\x5c\x35\x4b\x28\x71\x5f\x94\xb6\x25\x85\x70\x2a\x03\x6d\x2a\xd1\xd4\xb1\x74\x64\xb7\xb2\xd0\x47\x61\x0a\x9a\x6d\xd4\x98\xab\xa3\x51\x44\x56\x74\x4c\x84\x0b\xe9\x2f\xfc\x04\x24\xc2\xd8\x3f\x90\xfb\x6f\x94\xbd\xc5\xe3\x6f\x34\x99\xde\xb0\x34\x33\x00\xb8\x48\x39\x4f\x7f\x7b\x22\x33\x3f\x9c\x97\x1e\xce\xba\x3f\x90\xe3\x05\xe6\x43\x67\xf9\x7e\x95\x1c\x63\xdf\xdb\x8d\x31\x3f\xd6\x94\x44\xc4\x33\x68\xf9\x6d\x29\x54\x11\xbe\x88\x7a\x10\x23\xcc\xab\x51\xa1\x47\xa5\xd5\x95\x8c\xb5\x29\x4e\x6c\xe2\xb5\x02\x21\xdf\x0c\xcf\x0d\xc2\xef\xc7\x08\x11\xfd\x90\x3d\xc3\x9b\xd2\x59\x84\x0e\x56\x3a\x42\x54\xa6\x90\x24\x1a\x95\xc2\x65\x51\x11\xe9\x60\x65\xe0\x99\x90\x35\xbb\x8c\xd6\x23\x44\xba\x5e\x99\x62\x92\xb9\x9b\xb2\xd1\x06\x5d\x2c\xbb\x52\x42\x7e\xae\xc9\x8c\x30\x43\x3d\x98\x36\x7a\xe8\x12\x36\xc0\x4e\x06\xa0\xc7\x29\x99\x39\x96\x54\xc5\x35\xcd\x79\x8b\x82\xb6\x71\x8e\x00\x8f\xd9\x1b\x3e\x6a\x84\x49\x15\x81\x3a\x0a\xd5\x2c\x8e\x49\xb3\x47\xb0\x19\x22\xdd\x34\x48\x50\x56\x3d\xa1\xcd\x8e\x95\xa3\xa5\x25\xca\xba\x49\x90\x75\x96\x6f\xf2\xed\x36\x7b\x83\xf2\x81\xc3\x9c\x1c\x40\xea\x00\xe0\x0b\xbf\x65\x4b\xdb\x16\x2d\x8e\x1d\x00\x76\x60\x67\x0e\xd1\x99\x29\xae\x49\x1b\x20\x66\x3c\xd2\xf1\x84\xa3\x46\xe3\x69\x0e\x1e\xb2\x21\x0d\x43\x1d\x6e\xa3\x6a\x65\x54\xec\x4e\x69\x35\x24\xdc\x07\xef\x19\xd9\xd9\x76\x1b\xb3\x21\x09\x1b\x62\x18\x17\xaa\xa9\x4c\xf2\x05\xe1\x36\xae\x86\x20\x03\x3c\xb9\xd1\xbc\x1e\xa1\x6c\xbb\xc5\xc3\x2c\xb4\xed\xb6\x36\x21\x13\x3c\x28\x71\xc8\x30\x33\xa2\x26\x17\x8e\x6b\x2d\x09\x24\x4b\x5a\x78\x2d\x7f\x6a\x41\x93\x17\x2a\x9a\x94\xf3\x26\xa5\xbc\xee\xb4\xde\xa4\x9c\x53\x4a\x27\x1d\xe6\x4d\x55\xf0\xce\x66\x4d\x9d\x2d\xa6\xe0\x53\x95\xb0\xf5\x02\x52\x0e\x39\x31\x1e\x6b\xb9\xe3\x19\xce\x4e\x99\x3a\xc3\x58\x7f\xe3\xc4\x18\x61\xbd\x02\x49\xc7\x3b\x29\x69\xb2\xf5\x37\x4e\x4c\x8d\x32\x1d\x0f\x0c\xac\xbf\x65\x7f\x4b\x2c\x1f\xcb\xe2\xc9\x93\xc5\xb3\xa6\xe2\xc9\xdf\x32\xcb\xc7\x3b\xc3\x7a\xb9\xec\xc5\x55\xc1\xf1\x35\xdf\xde\x6e\xd5\x2f\x6d\xe1\xdf\xf6\xcc\x80\x44\x01\xb6\x6d\xcc\xa9\x4f\x00\x30\xe2\x47\xf8\x8c\x24\x8c\x73\xe3\x42\x30\xe2\x48\xca\x0a\xde\x55\x8e\xce\xe4\xa4\x37\xf0\x8e\x8b\xf3\x05\x83\x5d\x02\x7c\xe3\x93\x18\x6b\xfc\x5b\xc9\x18\x13\xe6\x92\x35\x19\x2b\x83\xd8\x76\xb1\x7f\x0b\x37\xa5\xb8\x94\xd6\xc5\x53\x74\x2e\xaa\x53\x33\xad\x2f\xd3\x12\x33\xed\x85\x48\x2b\xf8\xca\xf0\x65\x38\x78\xcc\x7c\x0c\xa7\x3e\x85\xf7\x7e\x02\xb1\x2f\x80\xdf\xc5\x29\xe6\xe0\x2f\x43\xb0\xf3\x4d\x00\x83\xce\x7e\x29\xdb\xfa\x4d\xb5\xb2\x68\xa4\xb6\x42\x3d\xc4\xa2\x22\xba\xe2\x22\xab\x9b\xb3\x4d\x4c\x04\xfd\x37\x22\x7f\x22\x06\x75\x4e\x19\xac\x1c\x59\x33\x1a\x45\x24\xb1\x60\x81\xf3\x3e\x8d\x36\x2e\x5e\x2c\x48\x12\x9d\xcd\x68\x1c\x39\x85\x3b\x37\xc5\xe0\x44\x10\x70\xf9\x6a\x5f\x84\x76\x76\xb0\x38\x77\x81\x7a\x85\x41\x9d\xa1\x0a\xcc\x52\xed\xa8\x31\xc3\x6f\x8e\x49\x85\x2f\x35\x47\x75\xd8\x76\xfb\x1c\x23\x06\xb2\x25\xc2\x0f\x99\x63\xf5\x23\x0b\xd4\x19\x58\xdb\xdb\x15\xdb\xb1\xa8\xe3\x43\xf5\x0e\xc4\x98\x18\xb5\x26\xd4\x03\xfd\xe2\x7c\x21\xac\xcc\x8f\xff\x6f\xeb\xe8\x3f\x8e\x5d\x46\x72\x66\x98\x1a\x6b\x1b\x3b\x9e\x9b\xe0\x84\x83\xd0\x3a\xcc\x15\xbe\x52\x94\xd2\xfa\x9a\xe0\xfb\x98\xb4\x58\xaa\xa4\xf9\x1f\x84\x38\xff\x83\x94\xe7\x95\x7c\xb5\xc7\x9c\xb1\x19\x69\x49\xe9\x2d\x5a\x9c\xa9\xd0\x84\x9f\x07\x1c\xaf\xe3\x70\x76\x0c\x40\xc7\x6a\x39\x3f\x08\xaf\x01\x3f\x80\x56\x3a\x69\x9d\xdd\xfc\xe2\x5a\x00\x56\x0f\x14\x89\x7c\xd2\x5c\x0e\xc7\x5d\x45\x69\xe1\x58\x2a\x02\xab\x65\x1a\x8c\x17\x44\x62\x61\x04\x4c\x80\x09\x07\xdf\x0f\xeb\x2a\xae\xac\x88\x63\x55\x63\xbb\x8a\x37\x6c\xa4\x34\xcc\x7b\x2b\xee\x87\x48\xcd\x52\x8f\x4e\x1c\x2a\x1d\x56\xd8\xb6\x63\xa8\x8c\xde\x54\x14\x09\x19\xd8\x6e\x4d\x7d\x92\x99\xd7\x4d\x00\xd8\x53\x2a\x25\xc0\xb7\xac\xce\xca\x61\x30\x01\x30\xdd\x6e\x73\xe5\x80\x1c\xce\xb8\x14\x29\x8c\x71\x52\xdb\x76\x62\xe4\x91\x17\x70\x86\x32\x06\x60\x6e\xdb\x4e\x6a\xdb\x7a\xf0\x1e\x30\x17\xa2\x6f\x94\x9b\x97\xfb\x94\xcd\x5a\x45\x4f\x84\x37\x98\xb2\x1b\x6e\xeb\x33\x1d\x7f\x6b\xa5\x09\x69\x8b\xc7\x6f\x5e\xaf\xff\x12\xce\x50\xca\xe0\x12\xe5\xac\x74\xad\x11\x21\xa3\x0f\x70\x8c\xde\x39\x31\x9c\x69\xed\x12\x9c\xa2\x59\x19\x29\x7f\xfa\x06\xf5\x82\x69\xb7\x0b\xc7\xc7\x28\xe6\x1c\x28\x7a\x83\xc6\xe0\x91\xa2\x95\xc3\x8e\xc7\x30\x01\x9d\xd9\x70\x1a\x4a\xad\xf0\x8e\x4e\x1c\xd5\xbf\x09\xba\x91\x4a\xab\xfa\x78\x00\xe0\xe6\x8b\x98\x32\xc7\x22\xfc\xe4\xdb\x47\x08\x4d\x0a\xd2\x3f\x19\x7a\xe1\x1b\xf4\x42\xfe\x38\x41\xfd\x97\x22\xfc\x0c\xff\xf8\xcf\x17\x6f\x7a\x83\x95\x08\x87\x74\xfc\x8e\x0f\xb6\x4c\x04\x30\x01\xbe\x9c\x6a\x91\x07\x5c\x96\xbe\xa3\x6b\x12\x39\x7d\x00\x69\x07\x2d\x87\x86\xd0\xc2\x8b\x1c\xbf\x00\x5d\x11\xd7\x5f\x6f\xb0\x72\x35\xfe\x5a\xf3\x3a\x71\x67\x9a\x6b\x43\x53\x13\xf8\x4b\x75\x1b\xe3\xea\x4d\x63\x82\xa8\xd4\xbf\x65\x28\xa9\x68\xdc\x98\x08\xf1\x5c\x6a\xdc\x84\xee\x3f\x29\x34\x6e\xc2\x09\x67\x52\x6a\xdc\x18\x97\xbe\x12\x53\xe3\xc6\x00\x5c\xca\x14\xad\x71\x63\x00\x46\x1a\xc6\xd0\xb8\x29\xda\xfd\x06\xbd\x37\x6d\xcf\xf4\xed\xb7\xda\x51\x96\xd5\xc9\x1a\xc1\x94\xd9\x80\xde\x78\x31\x1b\xa6\x61\xc7\xb2\xff\xb7\xf7\xba\x17\xa8\x32\x3d\x84\xa4\xea\x2e\xee\xbc\xee\x1d\xcd\x3a\x4b\xa9\xba\x8b\xb6\xdb\xfd\x4a\x4f\x2f\x4b\x5c\x53\x27\x07\x25\x2a\x81\x59\xc6\x0d\xac\x96\xd1\x86\x3a\x3a\x92\x84\x65\x75\xa2\xa0\x40\xb1\x04\x1d\x43\x45\x3a\x36\x55\xa4\xe3\xba\x8a\x94\xbc\xa9\xf5\x4d\xd9\xaf\x0c\x26\x8e\xb4\xbc\xee\x01\x5f\xff\x8c\x8c\x29\xfe\x6b\x85\xe1\x0b\xed\x6a\x65\x96\xc1\xef\x7e\x62\x2b\xa2\xcc\x15\xd7\x5e\xc2\x15\xad\xbc\x63\x92\xdf\x09\xc4\xee\x2c\x5f\xdd\xa6\x5f\xde\xbf\x45\x19\xc4\xda\x61\x2c\x4a\xa1\xba\x88\x40\xb9\xfa\x75\x87\xb4\x07\x52\x11\x64\x06\xcd\xca\xaf\xbb\x11\x5a\x8a\x90\x11\xd7\x3f\xa3\x48\xfc\xf8\x05\xc7\x54\xfa\xd9\x40\x63\x8e\x95\x73\x1b\x79\x51\x8e\x16\x10\xbb\xbf\x91\x2c\x5d\xe0\x08\x4d\x79\xf5\xf3\x5c\x6e\xda\x11\x9a\xa8\x50\x71\xfa\x7b\xc4\x5b\xcf\xb9\xeb\x08\xad\x20\xae\x58\x87\xa3\x8d\x82\x95\xfe\xba\xd0\xba\x2c\x7a\x9b\xca\x55\x89\xe6\x10\xab\x57\x6d\xe8\xbe\xf8\x79\x4e\xc8\x02\x3d\x88\x46\x9e\xf2\xe3\xd8\x47\xfa\x8d\xa0\x53\xf1\x7d\x2e\x1c\x4f\x7c\x23\xe8\x9a\x8f\x52\x9c\x26\x04\x9d\xf3\x5f\x82\x19\x9f\x09\x1e\x8c\x2e\x20\x36\x98\x70\x79\xc8\x44\x1f\x21\x76\x2f\x19\xc9\x30\x4b\x33\x74\x5b\x14\x2b\x92\x6e\xc4\x4c\x2c\x08\x66\xa7\x49\x74\x16\x13\x9c\x2c\x17\xe8\xb3\xa8\x57\x60\x39\x9b\xe1\x64\x4a\x93\xa9\x7c\x89\xf2\x91\xe6\x0c\x9d\x89\xd7\xea\x8c\x8c\x45\x84\xe2\x73\x1d\x8e\x1b\x7d\x12\xa5\xb8\xdc\x78\xa6\x02\x78\x46\x6f\x37\xe8\x8a\xcf\x53\xfa\x80\xde\x09\x97\xda\x5f\xde\xbf\x1d\xa1\x2f\x02\x50\xb6\xfc\x46\x3e\x2a\x25\x11\xba\x14\x13\xaa\x65\x80\x11\xfa\x00\x71\x63\x9c\x59\x74\x57\x64\xec\x87\x95\x45\xbf\xaa\x01\x6f\xc8\xfa\x45\x65\xd5\xd0\xfd\x55\x70\xd1\xb7\x87\xe2\xd0\xbf\xff\xb7\x7d\xbd\xf1\x96\x4b\x98\x45\x98\x28\xe4\xc9\x73\xe0\x5f\xca\xa7\x03\x5c\x12\xc6\xee\xc7\xab\xd1\xed\xc5\x15\xfa\x8b\xc8\xfd\xda\xa4\x29\x2f\x0a\x30\x70\xfc\x97\x5d\x80\xa5\x93\x1f\xf4\x55\x94\xf8\xed\x80\xc9\xca\x57\x79\x8d\xf2\xd5\x21\x40\xc6\x27\x3b\x72\x92\x2e\xad\xde\x2c\x14\x62\x82\x42\x2a\xdc\x4a\xe9\xf8\x80\xe8\x37\x81\xff\xbf\xd1\xb0\x0f\xfb\x61\x80\xdd\xf3\xeb\xdb\xdb\x8b\xf3\xd1\xc7\xcb\xab\x0b\xf4\xdf\x22\xef\x67\x34\xfc\x11\xbe\x10\x79\xa7\x37\x1f\x74\xde\xcf\x22\xef\xef\x3c\xaf\x0f\xcb\xb2\x23\x0e\x23\x21\xfe\x1e\x60\x23\x7c\x0b\xf2\x02\x5c\x44\x3c\x41\x7d\x51\xfa\xcf\x8d\x37\x06\xfb\x72\x6c\x60\x6e\x2b\xf4\x67\x51\xf6\xbf\x1a\x22\x8c\xe0\x28\x6a\xbe\xc0\x0f\x70\x91\x87\xfe\x4b\x14\xff\x0f\xf4\x68\xf0\x41\xff\x50\x3b\x0a\x46\x09\x76\x50\x33\xc9\x83\xc0\x92\x85\x4a\x48\x4e\x2e\x0e\x02\x0a\xde\x2a\xe1\x04\x5f\x3d\x08\x28\xb9\xae\xaa\x5b\x72\xdc\xc3\xb5\x2b\x8e\x2c\xa1\x15\x37\x3e\x08\xad\xb9\xb5\xc6\x5d\x72\xea\x27\x2a\x30\xd8\xb9\xee\xe5\xe6\x89\x4e\x6e\x38\x94\x36\xf2\xf0\x9b\x5e\x29\xc0\xb4\x41\x43\x5f\xc9\x16\xe1\xa5\xf7\xed\xa1\xd0\x7f\x88\x59\x64\xec\xfb\xa6\xf1\xeb\xed\xd9\xef\x9a\xc9\xaf\xb7\x67\xdf\x3d\x99\x5f\x6f\xcf\xbe\x7b\x3e\xbf\xde\x9e\xfd\x9e\x29\xe5\xcd\xf8\x5d\xb3\xfa\xf5\xf6\xec\x1f\x98\x58\x51\xcd\xef\x9a\x5b\xd1\xe7\x7f\x6c\x7a\x85\xc1\xcf\xd7\xdb\xb3\x1a\x5c\xc3\x44\x7f\xbd\x3d\x43\x8c\xc1\x5b\xf3\x2d\x28\xdf\xff\x86\x96\xb0\x78\xc2\xaa\x34\xad\x95\x83\x68\xcd\x43\xd9\x82\x90\x6f\xda\x07\x99\x56\x95\x76\x3c\x88\x51\xdb\x0b\xc8\x49\xa1\x62\x0d\x0c\xac\xa5\x12\x76\xbb\xad\x25\x38\x86\xce\x16\x12\xa0\x7d\xea\x12\xf2\x0d\x19\x39\x43\x12\xf2\x0a\x7a\xea\x2c\x42\x3a\x9d\x9d\xf9\x64\xb3\xd4\xd8\x42\xbc\xdd\x3a\x55\x9d\xb1\x57\xd3\x19\x03\xc8\xa4\x91\x26\x61\x0d\x4f\x40\x95\x32\x22\x23\x7f\x5f\x92\x9c\x9d\x26\x74\x2e\xcc\x8d\xde\x65\x78\x4e\x0a\x33\x25\xa9\x76\xff\xf2\x24\xcc\x3c\xfd\xed\x69\x80\xf4\x99\xf2\xf9\x81\x7c\x73\x2d\x29\xd8\x5c\xea\x74\xd3\x25\x73\x18\xf4\xc8\x8b\xe3\xd7\x3d\xb0\xdb\x39\x9c\x5f\x1a\x1d\x11\xe5\x11\x91\xac\x1d\x33\xf4\x58\xba\x2d\x12\x6e\xb9\x95\x17\x31\xbf\xdd\x83\x65\xce\xf9\x7d\x7c\x38\x53\xba\xf5\x5e\xb2\x27\x32\x57\x24\x33\x73\xb9\x1c\x43\x13\x22\x14\x39\x66\x82\x0c\xd7\xdf\xee\xc1\x4a\xa4\x3e\x1d\x4d\xbf\xfe\x5d\x3c\xe6\x16\xc2\x6f\x3d\x57\xfa\x23\xaa\x7c\xd5\x41\x64\x78\xfe\x1e\x9c\xd0\x38\x3e\x8d\x17\x33\xcc\x3f\xa6\x19\x8d\x2a\x8d\xd3\x09\x45\xe3\x66\x34\x12\x3d\x8a\xf1\xe6\xba\xe8\xbc\xcc\xd0\xe1\xf4\x8c\x8a\x1a\x62\xec\xf1\x64\x5a\x73\x78\xce\xd3\xe4\xe9\xe3\x9c\xae\xca\x8f\x9f\x3f\xbd\x35\x3f\xde\xf7\xcb\x2f\xed\x63\x8f\xb7\x2d\x37\x92\x67\xe9\xc3\x5f\x49\x96\xca\x28\xa2\x22\x9d\x4c\x49\x22\x3a\x5a\x8b\x66\x2c\x92\xb4\x45\xf0\x9d\x90\x2c\x8b\x30\x7e\x67\xf5\x19\x10\xa9\xba\xf5\xc2\x01\xa4\x0c\x0d\x9f\x66\x9f\xe3\x94\xbd\xa3\x71\x5c\x8c\x58\x63\xee\xfb\x0c\x47\x94\x24\xec\x30\xd4\x0d\xcb\xd2\x6f\xa4\x39\xff\x6d\xa1\xfd\xfb\x3e\xa8\xca\x84\xed\xd5\x74\x38\xf7\x5d\x9a\x91\xe7\xeb\x29\xa1\x0e\x63\x2a\x16\x54\x3e\x4b\x1f\xc4\xd8\xe6\xd7\x49\xb1\x64\x75\xc6\x97\x34\x56\x9b\x22\x17\xf5\x15\xb8\x96\x49\x24\x56\x98\x39\x05\xcb\xa4\x71\x85\x99\xc1\x68\xf8\x41\x14\x52\x86\x1e\xcf\x2f\xde\x9d\x7e\xfd\x78\x7b\x90\x91\x60\xf7\x9e\x4c\x69\xf2\x19\x73\xb6\x2c\x0e\xa3\x71\x2c\x14\xae\xe2\x68\x8a\xb3\xb1\xc3\x41\x53\xd8\x83\xfd\x23\x15\x72\x8c\xcb\x7e\x0a\xd2\x91\x0c\x46\x2e\xe9\x1c\x51\x49\x4d\x12\x86\x8e\xff\x6f\x36\xbd\xc7\x83\xbf\x39\xce\xdf\xa2\x47\x0f\xbe\xd8\x01\xf8\xb7\xfc\xa8\xf9\xc3\x19\xf8\xe2\x7b\xd8\xf3\x42\x67\xe0\xff\xcd\xfd\x5b\xd4\x01\x03\x00\x06\x7f\x03\xff\x71\x0c\x33\x86\x86\xd6\xcf\x16\xb4\x3e\x59\xd0\x7a\x6b\x41\xeb\xd6\x82\xd6\x9f\xad\x10\xa6\x3c\xe3\x9b\xca\x78\xaf\x32\x3e\x5b\xd0\xba\xb0\xa0\xf5\x57\x0b\x5a\x77\x56\x08\x73\x0e\x34\xb7\xa0\xb5\xb4\xa0\x95\x58\xd0\x5a\x58\xd0\x9a\x58\xd0\xc2\x16\xb4\x7e\xb3\xa0\xb5\xb1\x42\x18\x73\xa0\xff\xc2\x3c\xfb\x1d\xb9\xe7\x18\x71\x66\x41\xeb\x74\x91\x89\xdf\x1b\x0b\x5a\xff\xb5\x4c\xc4\xbf\x31\x4f\x5f\x4e\x2d\x68\xdd\x10\x8e\xea\x7a\xcc\x2c\x68\x5d\xa5\x2b\x0b\x5a\xe7\x64\x6c\x85\x55\xfb\x59\x7d\xd4\xf2\xbd\xd7\xbb\x10\x7a\x3f\xfd\xe3\xce\xc0\xfe\x8d\x0e\x67\xa6\x49\xec\x77\x7a\x29\x6b\x34\xe2\x14\xd1\xf9\x10\x19\xf6\x42\xd3\xc3\x4a\x5b\x5f\xce\x63\xdb\x6e\xaf\x0d\x15\x81\x83\x95\xe7\x0c\x21\xf5\x5c\x48\xcb\x95\x8b\xf5\x82\x8c\x19\x89\x94\x62\xbb\x95\x66\xc2\x64\xa5\x75\xbf\x64\xad\x69\xca\x5a\x56\x47\x63\xeb\x58\xbe\xf4\x76\xeb\x5a\x66\xb8\x43\x4f\x04\x3b\xdf\xf7\x0a\x48\x86\x34\x34\x94\xd3\x89\xa1\x1f\x4f\x6c\x7b\xbf\xb5\x89\x6a\x6d\xa1\xe0\x70\x12\xf0\x7d\xed\x15\x32\xcd\x7e\x83\x13\xd9\xe0\x44\x34\xf8\x1f\xf4\xf3\x56\x75\x2d\xab\xe7\x80\x99\xca\x78\x11\xf1\xbd\xdd\x83\x22\x0a\x7c\xa6\xcc\xab\x02\x96\x6d\x8a\xbb\xc2\x14\xe6\x88\x0d\x6f\x36\xf3\xfb\x34\x76\xa9\xd2\xad\x84\x0e\x08\xda\x0e\x45\x4e\x8a\xf4\x85\x38\x70\xa3\x34\x21\xc2\x8a\x4a\x9a\x41\xa4\x32\x06\x18\x80\x6d\xb2\xdd\x62\x35\xc6\xc2\x30\x27\xe0\x55\x82\xa0\xbc\x49\x49\x78\x13\x32\xc4\x76\x13\x9a\xe0\x38\xde\x88\xeb\x99\x36\xb5\xed\x5c\x99\x64\x97\xbf\x1c\x50\x00\x09\xf7\x36\x72\x88\xb3\x42\xcf\x5b\x5c\x1c\x96\x8e\xf6\x95\xdf\x5f\x31\x35\x7a\x8a\x1c\x02\xca\x0b\x2f\x3a\x71\x6a\xfd\xe3\xbb\x46\x0e\xb9\x01\xc8\x04\xaa\xa0\x9c\xd4\xdb\xcd\x82\xa8\x89\xbd\x4c\x56\x38\xa6\x51\x0b\x33\x46\xe6\x0b\xd6\x62\x69\x4b\x44\xca\x59\x8e\xd9\x32\x23\xad\x24\x4d\xba\x02\xf7\x7d\x4c\x0a\xbb\x20\x4b\x88\x65\x30\xae\xaa\x67\x94\x2b\x7e\x00\x67\x28\x73\x62\x00\x97\xd5\x6c\x7d\x31\x05\x23\x94\x39\x4b\x00\xc7\x8d\x1e\xef\x84\x4f\x89\xcc\x19\x03\x38\xad\xe6\x1b\xf2\x46\x77\xce\x05\x0e\x0b\xc0\x09\xca\x9c\x29\x80\xa3\x43\x6a\xa2\x15\x4a\x9c\x11\x80\x9b\x66\x17\x20\x6b\x94\x38\x1b\x00\xe7\x4f\xfb\xe7\xbb\x47\x99\x33\x07\xf0\xe1\x79\xff\x7c\xa7\xc8\xc9\x9c\x07\x00\x05\x20\x9d\x70\x31\xb5\xcb\x70\xb6\xb0\x00\x80\xd7\x28\x73\x4e\x01\x3c\x57\x58\x30\xc3\x33\x29\x4e\x1e\xab\xfa\x2c\x00\x2f\x50\xe6\x9c\x03\xf8\x71\x1f\xe6\x1e\x67\x79\x57\xdc\x50\x59\x00\xde\xa2\xcc\xf9\x08\xe0\xcd\x01\xb0\xf1\x32\x67\xe9\xdc\x02\xf0\x33\xca\x9c\x1b\x00\xcf\x0e\x56\xd9\x9d\xa8\xf1\xe4\xdd\xfc\x84\x32\xe7\x0c\xc0\xab\x03\x58\x4d\xd0\x77\x28\x73\xae\x00\xfc\xd6\x0c\x6a\x01\xf8\x05\x65\xce\x37\x00\x2f\x25\xc0\x22\x5e\x4e\x69\x92\x1f\x1b\xde\x4e\x2d\x00\x3f\xa0\xcc\xb9\x04\xf0\xae\x06\xb3\x26\x3c\xf3\x57\x94\x39\x77\x00\xfe\x52\xcd\x14\xf1\x23\xba\xda\xd7\x1c\xfc\x2b\xca\x9c\x5f\x00\x7c\x5b\x05\xe2\xc2\xae\x50\x10\x66\xce\x5b\x00\xff\x52\xcd\x94\x82\xa4\x05\xe0\x57\x94\x39\x7f\x01\xf0\xb7\x6a\xb6\x10\x7f\xba\xb9\x92\x7f\x2c\x00\xff\x1b\x65\xce\x6f\x00\xfe\x5c\x9d\xfb\xe9\x8a\xfe\x66\x01\xf8\x77\x94\x39\x3f\x03\xf8\xe7\x7d\xc5\x93\x70\xc6\x3c\xa2\x09\x65\xa3\x91\x8e\xaa\x13\xfc\xd9\xbd\x3a\xfd\x74\x81\xb4\xfb\x3e\x0b\xfe\xd9\xfd\xe5\xe2\xcb\xcd\xe5\xf5\x15\xb2\xfa\xae\xe7\xf6\x78\x8a\x12\x7a\x46\x5f\xae\x3f\x7e\x1c\x7d\xbe\xf8\x72\x79\x7d\x8e\x3c\x23\xfd\x2f\x97\xe7\xb7\x1f\xd0\xcb\x9f\x7a\x46\xda\x87\x8b\xcb\xf7\x1f\x6e\xd1\x8b\x3e\x4f\x3c\xbd\xba\xfc\x74\x7a\x7b\x79\x7d\x35\xba\xb9\xbd\xf8\x7c\x83\xbc\x7e\x25\xf1\xfc\xeb\x17\xf1\x03\xf5\x7b\x1c\xfa\xb3\x8c\x67\x99\xa3\xa8\x70\x71\x35\xd2\x69\xf0\xcf\x2e\x8e\x22\x12\x95\x3e\x75\xcf\x6e\x6e\x38\xad\xfd\xb3\xe9\x79\x57\xf5\xb2\xc9\x5b\xb9\x18\x06\x9a\x8f\x54\xac\xa3\x11\x3f\xb0\x8c\x0a\xdb\xa7\x8c\xe0\x68\xf3\x2e\x91\xce\x22\xf5\x45\xaa\xc1\xab\xf8\x01\x18\x0b\x13\x3f\x8c\xfe\xec\x8e\xd3\xc5\xe6\x6b\x4e\xb2\x53\xe1\x70\xd2\xc1\x00\xee\x5b\x18\xda\xb6\xc3\xca\xbb\xff\x29\xd1\xcf\x26\xde\x6e\x2e\x23\x87\x01\x00\xdb\x6c\x9f\xad\x9d\xa5\x89\xa4\x75\x34\x99\xb6\xd4\x04\xb7\x1e\x28\x9b\xb5\xb0\x20\x7d\x64\x2d\x74\x87\xac\x15\xd1\x55\xdb\x52\xbe\xff\xe6\x98\x26\x11\x5d\x15\xc6\x59\x13\x1a\x93\xc2\x6e\x2b\x4b\xe3\xf8\x33\xc9\x68\x1a\x8d\x10\x36\xbe\xb6\xdb\xc6\xe9\x2d\xcc\xbb\x56\x34\x5d\xe6\xbf\x90\x8c\xd1\x31\x8e\x7f\x1d\x21\x6d\xb4\x55\xec\x3c\x8e\xae\xf8\xd8\x6e\xb5\x42\xc0\x8c\xc3\x89\x8d\x2f\x69\x5e\xb2\xe7\x7a\x58\x3a\xe7\x74\x69\x92\x90\xec\xc3\xed\xa7\x8f\xc8\xb2\xa0\x25\x8d\x59\xa4\xf5\x83\x08\xe1\x61\xdb\x58\xff\x70\x2a\x19\x48\xa5\x77\xac\xc5\xda\x02\xd5\x92\x32\xe4\x07\x2f\xaa\x7f\x39\xd5\x2c\xa4\x73\x9e\x2a\xdd\x93\x86\x35\xe2\x6d\xcc\x87\x03\x78\xea\x8b\x5f\xe0\x6b\xec\x46\xad\xf5\xb5\x9d\x24\xdb\xa1\xec\xe5\x64\x6c\xa1\xa2\x6e\x71\x90\xe1\xec\xff\x41\xfe\x50\xeb\x56\x05\x10\xaa\x35\x91\xc3\xcd\xd4\xaf\x9e\x30\x24\x29\x5d\xdd\x0b\xb9\x62\x22\x0f\x90\x8b\x99\x88\x63\x5a\xfa\x19\x94\x1e\x54\xd1\xe3\x0e\xae\x2b\x4e\x15\x8d\x4c\xa8\x0d\xfa\xf6\x61\xcf\x09\x59\x38\x46\x1e\xbc\xd7\xfb\x58\x15\xb9\xe7\x47\x3c\x9c\x6d\x2e\x23\xc3\x2b\x6b\x4e\x98\xf0\x68\xf9\x76\x73\x85\xe7\xa4\x74\x04\x1b\x49\xbf\xcd\xca\x4f\xaa\x86\xce\xc8\x94\x6f\x81\x8c\x44\x2a\xe6\x4e\x91\x43\x4c\xdd\xba\xe1\x50\xd6\x70\x76\x2f\x9e\x77\x2c\x74\xa3\x44\x53\x55\xcb\xd4\x8d\x17\x67\xea\x13\x3c\x26\x23\x1d\xe2\x44\xd1\xe2\x91\x19\x87\x87\xa2\x3f\xbb\x9f\x3f\x7e\x7d\x7f\x79\x75\xe3\x8e\xd3\x64\x8c\x25\x26\xd3\x6d\xbf\x2a\xc6\x27\x53\x06\x01\xa7\xfb\xc1\xbf\x61\x8a\xe8\x30\x09\x03\x2d\x2c\xb6\x11\x4a\x5d\x11\x2c\x0e\x33\x32\x48\x7d\xde\x56\xed\x43\xe7\x51\x22\xf4\x33\x28\x7a\x99\xfb\x8f\x3b\xc3\x0b\x27\x94\xb9\xd7\x86\x77\xd2\x18\x65\x05\x2e\xd9\xcf\xa2\xf9\x33\x11\x7f\x02\xc4\x75\xbb\xb8\x19\x17\x39\xd5\x30\xe6\xc3\x59\x88\xe2\xe1\x2c\x54\x24\x46\x0f\x83\x14\x48\x73\xb0\x2b\x5f\x41\x8b\x10\xe7\x15\x98\x7a\x4f\x97\xa8\x92\xcf\xfb\x5c\x69\xcb\x52\xd5\x09\x84\xa3\x5b\xf9\x7b\xbf\x71\x12\x57\x84\x96\x65\x0b\xe1\x18\x0d\x97\x0a\x2f\x8c\xc2\x40\x60\x6b\x5a\x0b\x83\xa6\xc4\xe1\x2c\x94\xdd\x19\x2b\x67\xa7\xfb\xf9\x68\x38\x0e\x77\x3b\x63\x81\x9c\x67\x78\xba\xbf\x48\xa4\xa5\xac\x03\x76\x15\x66\x54\x0d\x0d\xb5\xef\x50\xb1\xed\xb0\x43\xed\x05\xa5\x09\x9e\x32\xf5\x54\xbc\x40\x34\xb4\x12\xb0\xd0\x83\x6a\x35\x7f\x96\x6f\x34\x49\xc4\xd3\xaa\x0f\x36\xfd\x9a\x4e\x5a\xdf\xa3\x73\x0c\xca\x89\xe2\x99\xa0\xc9\x2d\x7e\x7c\x6d\x55\x0b\xb7\xf8\xc9\x39\x4d\xba\x65\x91\x96\xc8\x76\xad\xd2\x7d\x5f\x51\x37\x6a\xf7\x76\x70\x51\xbe\x27\xbd\x61\xe9\x62\x21\x9b\x54\x7b\x69\x6a\xb6\x09\xbb\xfb\x45\x38\xa6\x5d\x50\x50\x21\xac\xe3\x48\x28\x1f\xb9\xf5\xb9\x92\x0e\x23\x29\x30\x5e\xe7\x97\x16\x39\xc9\x1b\xbe\x4a\xb5\xfb\xb4\x4c\x6c\x3b\x7e\x68\x96\x1b\x70\xe8\x49\x97\x71\xfa\x39\x30\x06\xb0\xa9\x41\x40\x2a\xc9\xf5\xe9\x68\xaf\xeb\xd5\xc9\x17\xc1\xe8\xf8\xba\xbc\x54\x67\x94\x51\xb3\xe9\xad\xb4\x1f\x6d\xda\x3e\xa4\xe6\xf8\xbf\xd8\x3e\x24\x94\x71\xb0\x65\x82\xf9\x38\xa2\xb8\x60\xd0\x99\x15\xdb\xcf\x4a\xfb\x64\xd4\x54\x12\x35\x38\xc1\x6d\xb7\xeb\x8c\x3c\x90\x6e\x4c\x4d\xef\xcf\x15\x17\x9b\x22\xb4\xb5\x3b\xc7\x0b\x67\xff\x46\xa6\xdd\x66\x46\x08\xeb\x1d\x70\x85\x33\xe8\xeb\x89\xd3\xee\x01\x3e\x2d\xa5\x05\x2a\xdb\x6e\xcb\xa0\x63\x45\x3d\xdb\xad\x34\x80\xdd\x54\xaa\xc7\xc1\x9e\xe8\x24\x9c\xbb\x2e\x30\x3f\xe6\x30\x92\xb5\x68\xde\x1a\x0a\x83\xbd\x50\xc6\x24\xbb\x27\x62\x14\xa0\x08\x4a\x96\x66\xad\x1f\x36\x3f\xb8\x56\x6d\xc7\xb2\x54\x5a\x6f\x1c\xf0\x2d\xad\xe5\x2c\xa5\xcd\xb1\x86\x4a\x76\x6e\x59\x1d\xa9\x53\xa2\xd1\x80\xff\xe3\x33\xd0\xb1\x42\xab\x8a\x9b\x73\xa1\x3a\x11\xd0\x7d\x1c\xd4\xf9\x54\x35\x28\x0b\x87\xf5\x9b\x40\x84\x37\xc5\xda\xaa\x93\x4c\xa0\xb9\xa2\x02\x87\x7c\xfb\xb8\x57\xf6\x4a\xba\x6f\x7b\x16\x45\xc9\xe8\x1a\xd1\xc8\x41\xfc\x67\xb1\xbc\x4d\xd3\x98\xe0\xe4\x9f\x45\x53\x8d\x34\xfe\x8f\xe3\xa9\xc4\x02\x7a\x66\x78\x1b\x22\xbb\xef\xe3\x54\xec\xfb\x17\x4a\x1e\x14\xd0\xe8\x80\x47\xea\xa0\xae\x88\x29\xec\x2b\x88\x29\x98\x89\x6d\x58\xf8\xb5\xb5\x6d\x3a\x64\xa1\xfc\x77\xff\xbd\x96\xf0\x71\x3b\xc4\xa1\xaf\xdc\x13\xb3\x9a\x7b\x62\xa1\xbf\x2c\x0d\x59\xcd\x6a\x86\x38\x1c\xd4\x13\x7c\x87\xaa\xa0\xf6\xaa\x19\xf0\x7b\xeb\x17\xfb\x9a\xd9\xb6\x8e\x8f\xdf\x6b\x02\x2e\x33\x65\x91\x7e\xb5\x8c\xf7\x54\x19\x4f\x94\x51\xfb\xcf\xc1\x40\x04\xd1\x32\xe7\xa1\x3c\x12\x1d\x72\x5d\x6b\x1c\xa1\xaa\x45\xcb\x60\x75\x87\x8a\x1a\x44\x74\x50\x4f\xf0\x4b\x87\xd3\x17\x6b\x96\x91\xb9\xbc\x47\xdf\xab\x40\x67\x1e\xf6\x78\x5f\xd9\xb7\x8e\xb5\x16\x4d\xfa\x8c\x23\x0b\x1c\x2b\xd6\x21\xce\xd0\x23\x11\x8d\xd2\x7d\xd0\xe6\x88\xf2\x92\x77\x39\xff\x92\x3e\xe4\x8e\x16\x39\x86\xbd\x2e\x83\x5e\x87\x15\xd1\xf4\xc4\x08\xe0\x87\x73\xcc\xb0\x98\x01\xa1\x6c\xae\xa6\x56\xbe\x0a\xb6\x1b\x2a\x85\x34\x2b\xac\x3e\xbb\x24\x20\x5d\x44\x8f\x18\xc4\x1d\xfe\x47\xb1\xa7\x21\x81\x38\xac\x76\x7c\xf3\x3d\x1d\xc7\x6c\x46\x32\x1d\xdd\x45\x5d\x79\xf3\xb9\x22\x91\x72\x23\x2d\x2d\xdd\x21\x41\xcc\x25\x0a\x17\x34\x59\x96\x94\x6d\x55\x50\xbb\xbb\x62\x32\xf3\x91\x53\x15\x36\x24\x70\x65\x97\x8b\xa0\x01\x58\x04\xc7\x6b\xe2\x7a\xad\xa2\x46\xc5\xf6\x1a\xba\x57\x5b\x38\xcc\x78\x7f\x89\xa4\x4d\x35\x43\xfc\x70\x76\xd2\xdb\x6e\xd9\x1b\x93\xd3\x2a\x8b\xcd\xfa\x63\x08\x62\xc0\x70\x81\x48\x8f\xee\x81\xc0\x7e\x8d\xe9\x5e\xd8\x34\x13\x72\x58\x9e\xf0\xbe\x54\x48\x31\x66\x03\x85\x08\xa3\x1c\x2b\x69\x27\xd2\x3a\xb8\x23\x01\xc6\x9b\xc8\x1a\x13\x3e\x4f\xe7\x22\x30\x53\xdd\x75\xa8\x1e\x5c\xb9\xde\x04\x9c\x0a\x5d\xa5\xcf\x97\x22\x4d\x45\x75\xe2\x05\xc2\x06\xd4\xb2\x48\x7d\xdc\x6b\x6f\x5f\xf6\x06\xb5\xb2\x85\xf4\x22\xaa\x04\xab\x2c\xae\x78\xd6\x1d\x87\x75\xf1\xb0\x17\x82\x63\x07\x0f\xbd\x50\xfe\x3e\x22\xee\x43\x43\x6b\xee\xea\xad\x29\x6f\x14\x54\x8f\xaa\xb1\xaa\x78\xbe\x21\x33\xe1\xbd\xf6\xd2\x86\xf6\x96\xce\xce\x37\x1d\x7c\x44\xdd\xd9\x5e\x43\x30\xc3\xdf\x37\xe4\x98\xe1\xfd\x31\xc7\x0c\x3f\x39\xe8\x45\xa1\x3f\x7e\xd4\x8b\x30\x57\xcd\x6c\xb7\x16\xb3\x4f\x53\x22\x11\xf1\x70\x0d\x8e\x89\xfb\x50\x78\xf0\xd9\xb3\x3d\x74\xb0\xa0\x75\x22\xc2\x65\x61\x1d\xcd\xd3\x3a\x46\xf1\x23\x63\x8a\x9b\xfa\xdd\x38\xbf\x4f\xf5\x1c\x37\xf5\xbc\x0c\xdb\x59\xee\x9f\xc0\xa4\x16\x32\x40\x42\x0f\xec\x69\x3c\x0e\x0c\x06\x01\xfa\x7e\x8e\xaf\x55\x77\x03\x8e\xb1\x3b\x7b\x62\x28\xa8\x18\x05\x3e\x1e\xa5\x87\x34\x2a\x86\x02\xf3\x35\xe5\xce\xba\x4c\xa0\x38\x12\x90\x5d\xda\x34\x1c\x95\x85\xfc\xbd\x23\x52\xef\xa0\x1c\xa3\x83\x03\xf2\xbb\xbb\xbf\xd6\x61\x43\x79\x8b\x61\x66\x7c\x7b\x21\x08\x30\x72\xb2\xee\xba\x08\xa4\x09\x8e\x9d\xac\x9b\x28\xff\x02\x18\xc9\xbe\x32\x70\x6c\x74\xba\x78\x0d\x77\xa0\xf7\xbf\x77\x1f\x1c\x5a\xf4\xed\x82\x81\xff\xbe\x95\xaf\x3b\x23\x16\x2c\x4c\x8c\x6f\xde\x5f\x82\x9c\xb2\xb7\x5d\x0a\x8e\x85\xb9\xae\xec\x2f\x41\x4d\x64\xad\x7c\x9d\x5d\xe9\x6f\xb2\x9c\x9f\xa5\xf1\x72\x9e\x1c\x8c\x07\xa0\xc5\x85\x41\x5d\xc0\xd8\x4b\x50\xdc\xc4\x37\x4e\x2f\x45\x84\x1f\x9d\xd7\xdb\xab\x9e\x0b\x35\xbf\xaf\xee\x03\xb8\xa6\x84\x49\x3f\x56\xcd\x32\xbf\xe4\xce\x4d\x88\x06\xc2\x01\x02\xe1\x00\xe4\x4d\x4d\x60\x0a\x2b\x30\xf5\xcc\x21\xa9\xd1\xd0\xba\x76\xf2\xb9\x03\xaa\x94\x8f\x54\xd0\xf8\xa7\x1f\x20\xc2\x0a\xac\xd2\x4e\x33\xb2\x66\xa7\x31\x9d\x26\xc8\x8a\xc9\x84\x59\x8d\x40\x8b\x34\xa7\xe2\x4c\x65\x65\x24\xc6\x8c\xae\x88\x05\x59\xe5\x2d\x62\xa5\x94\x56\xb4\x8a\x6b\xd7\x11\x5a\x57\xde\x26\x38\xd5\xdc\xbd\x1a\xf0\x7d\x9e\xc6\x4b\x46\x2c\x1d\xc8\x2b\x8a\x48\xa2\xe2\x77\x49\x3c\x9f\xe3\x94\xfd\x4c\x99\x44\xa7\x84\x41\x85\xad\x8a\x7b\xcc\xd6\xbc\x76\xc3\x8a\xbb\x01\x56\x55\x70\x00\x56\xe5\x02\xad\x91\xce\xe9\x6f\x7a\x54\xf3\x42\x29\x58\x8c\xd6\xde\x88\x54\x8b\x1f\x86\xab\x36\x69\x9e\x2e\x73\xa9\x4c\x54\x55\x55\xba\xff\x69\x2f\x57\xb7\x43\x5e\x83\x4b\xd5\xf7\xac\xaa\xfa\x36\x58\x6d\x50\xd6\xf1\x29\x5d\x11\x1d\xfa\xb4\x42\xa8\x48\x99\x2f\x83\xc7\x94\x65\x4a\x6b\xc5\xfd\x43\x2c\x46\xcc\x65\x38\x9b\x12\xb6\xdd\x32\x77\x92\xa5\x73\xd5\x44\x4e\xc5\x5d\xb1\x76\x48\x74\x5b\x00\xb0\x54\xfb\x17\x5b\xef\xbf\x14\x71\x30\x24\xe5\x8a\x52\xa6\x22\x75\x18\x5a\x85\x21\x45\x13\x8d\x56\xe3\x28\x3a\x4d\xa2\xdb\x0c\x8f\xbf\x89\x51\xd3\x6f\xfc\x2d\x01\x2b\x42\xf8\x37\xf6\x0e\x1c\x28\x7e\x60\x8a\x14\xbe\x79\xba\x22\x26\x42\x73\x88\x2b\xab\x48\x27\x6a\x73\xdb\x6a\x6a\x6d\x36\x64\xa6\xf3\x6c\x97\x24\x9c\xd5\x54\x0f\xa8\x71\xe9\xda\x5a\xde\x0b\x26\x5f\x23\x01\xf2\x16\xcb\xb8\xae\x92\x37\x5f\x4d\xa0\xea\xaa\xcc\xbc\xb4\x12\xc0\xc1\x93\x47\xd9\x45\xf1\x48\x49\x46\x68\xde\x6e\xd7\x8d\x4f\x98\x9c\xfa\x0e\x57\xf7\x16\x9a\x9e\xec\x35\xf4\x88\x54\x09\x4e\x43\xf3\xea\x20\xcf\x77\xb9\x0a\x79\xa8\xc7\xd0\x93\x6f\x83\xeb\x4d\x96\x81\xb7\x1d\xa2\x35\xdd\xf8\xb9\xee\x1a\x44\x4a\x75\x57\xa5\x34\x74\x17\x57\xe8\x5a\x63\x77\x6b\x20\xcf\x77\xb7\x0a\xf9\x64\x77\x71\x11\x17\xaa\x68\xb2\xea\x2e\x86\xb8\xb6\x06\x85\xb9\x4f\xba\xd9\x5b\x7b\xe6\x50\x65\x24\x67\x69\x46\x9c\x7d\x72\x5d\x66\xed\x59\xd8\x57\x15\xec\x5d\x2f\x60\x6f\x50\x2f\x60\xfa\x5e\x80\xd4\xc0\x16\xe9\xc2\x01\x01\x51\x09\xba\x59\x9c\x9e\x54\x53\x1c\x15\x3b\x5a\xbe\x55\x14\xfb\xaf\xb8\x9c\x74\x00\x5c\x9b\x8f\x18\xbf\x9f\xcc\x54\x8b\xfd\x33\xe4\xa5\xb9\x01\x4f\x11\x85\xa6\x44\xe9\x18\xc6\xb0\x7d\x23\x52\x09\x10\x08\x13\x48\xc1\xb5\x38\x1d\xce\x1d\x10\x00\xe6\x10\x77\x42\xb3\x9c\x89\x64\x00\x49\xc5\x8f\x40\x25\x6f\xe7\x54\x24\x17\xbd\xf2\x9f\x70\x53\xd2\xe0\x90\x89\x84\xc2\xc1\x15\x91\x3e\xa7\xc0\x2e\xc0\x8e\xc9\xfa\x00\x54\xdf\xfa\x50\xa5\x13\xea\x17\x76\x0d\x82\x44\x83\x4a\xb6\x2e\xb9\x94\x27\xff\xc3\x52\x8b\xce\x63\xe9\xa2\x30\x09\x60\xe9\xa2\x48\xe7\x52\x56\x91\xc1\x3f\xe0\xff\x6a\xd8\x7b\xb0\x71\x97\x15\x48\x0e\xec\x55\xf2\xdc\x06\x25\x4d\xc3\xb0\x2f\x50\x1c\x92\xa6\xd5\xbe\xac\x22\xc9\x89\x34\x4c\xcf\x0f\xc9\xaa\x53\xc2\xa4\x11\xb7\x23\x15\x74\xe5\xa6\x94\x3a\x39\x59\x56\xdf\xed\xcb\xef\x4f\x78\x51\x09\xb5\x89\x0f\xb1\x0d\x01\x7e\x83\xd9\x32\x13\x37\x78\x16\xd8\x6e\x3d\x7d\x66\x3c\x00\x2d\x64\x7c\x0e\xe8\xbe\xd2\x1e\x57\x55\xa4\x9e\x3e\x3f\x17\xea\xa2\x95\x32\x32\xd6\xaf\xc8\x2a\x9d\x74\x38\x3a\x48\x0f\x11\x71\x75\xe8\x44\xba\x9a\x91\x3e\x0c\x10\x1b\xe6\x1d\x2f\x84\xb3\x43\x67\x37\x1d\x87\x5f\xe0\xb7\x60\x2c\x0f\x7b\x33\x8e\x26\x03\x33\x94\x0d\xf3\xff\xd4\x4e\x2d\xc3\xd2\x45\xee\x12\xe5\xff\xd9\x1f\x24\x1d\x27\xef\x78\xe0\xb8\xef\x97\xcd\x57\x29\x00\x46\xc8\x3b\x5a\x1e\x3b\x5e\x87\x80\x60\x86\xd6\xc5\xcb\x69\x27\x92\xbe\x95\xcc\x61\x97\x2a\xbb\x19\xa8\x8f\xfd\x30\x0e\xd1\x6c\xb7\x77\x3c\x92\x13\x7d\x70\x79\x48\x9c\xfb\xd7\xa3\x52\x59\x2f\x63\xcf\x35\x04\xc1\x2b\xaf\x48\xbb\x1e\xc4\xfb\x8b\x46\x9a\x1c\x63\xd3\xe4\x98\x4e\x1c\x3c\xa4\xa1\x88\xae\x48\x10\x0d\xcc\x1b\xdb\xae\x87\x10\x91\xc7\xad\xc7\x04\xcf\x89\xcf\xe0\x58\x9c\x50\x7d\x02\xc5\xe4\xc5\x2a\xaa\xa7\x39\x93\x43\xd2\xf5\x42\x28\x7a\xe0\xd7\xc7\x82\x85\xe2\x99\x8d\xef\x75\xf6\xa6\xb2\x12\xd9\x8f\xcb\x9c\x4d\x1b\xec\x4b\x1a\xc7\xcf\x9d\xe8\xf4\x83\x30\xa1\xd5\xce\x46\x01\x29\xe4\x42\x99\x80\xc8\xc1\xc3\x1d\x4d\x16\xc2\xf8\x95\xb8\xbc\x4e\x64\x71\x01\xa2\xa4\x05\x11\xcd\x17\x31\xde\x20\x2b\x49\x13\x41\x9e\xc6\x31\xce\x45\x00\x3f\x64\x69\xbb\x42\x59\x47\x5d\x9a\x33\x4f\x29\x04\x80\xa0\xba\x0f\x2b\x97\x76\x8e\x55\xbe\xc8\xb0\xc0\xc0\xba\x8f\xd3\xf1\x37\xcb\x57\x75\x96\xdb\xf1\x34\x23\xd8\x01\x30\x41\x8f\x2c\x5d\xf8\xd4\xdd\x74\xa8\x3b\xeb\xf6\x5f\x49\xea\xc4\xa9\xa1\x4f\xdd\x75\xc7\x93\xdf\xaa\xe9\x3e\xde\x05\xc4\xe5\x1c\x0a\x59\x7d\xde\x03\x71\xc9\x5c\x0e\x97\xba\xb0\x29\xed\x98\x54\xd7\x61\xc2\xc7\x24\x4d\xc6\xb3\x43\xf7\x36\x2e\x8e\xfe\x7b\x99\x33\xde\x6e\x47\xa1\x6d\x9e\xc1\xaa\x31\xc8\xfe\x0c\x3e\xca\x4b\x76\x9a\x4c\xfd\xb6\x07\x69\xfe\x19\x27\x49\xf1\xd1\x3f\xff\x8c\x13\x61\xbe\x91\xe1\xe9\x0d\xc3\x19\xfb\x55\x84\x54\x2d\xbf\xef\xca\xef\x8b\x24\xfa\xb5\xf2\x65\xe4\x9d\xd3\x8c\xc8\xd7\x47\x22\x69\xf1\xff\x91\xf7\xee\xdf\x8d\xdb\x48\xc2\xe8\xef\xdf\x5f\x21\x73\xef\xb2\x89\x26\x44\x8b\xea\x24\x33\x21\x0d\xfb\x38\xfd\x48\xb2\xd3\x8f\xf4\x23\x99\x4e\xb4\xba\x3a\xb0\x08\x49\xdc\x50\xa4\x86\xa4\x5e\xb1\xf5\xbf\xdf\x83\x02\x40\x02\x7c\xd8\xee\xcc\xce\xfd\xbe\xbd\xf7\xe4\xa4\x2d\x82\x00\x08\x14\x0a\x85\xaa\x42\x3d\x72\xb6\xab\xab\xcb\xa7\x5f\xeb\xa7\x17\xed\x26\xc2\xb2\xe3\x2d\x3b\x94\x2f\x6e\x12\xf0\x14\x83\x21\x0a\x3b\xc9\xd7\x6c\x51\xae\xb3\x42\x38\x99\x42\xf5\xc3\xcf\x69\x5c\x16\x3f\xb1\x1c\xf8\x51\x39\x10\x8e\xd0\x1c\xa0\xf2\x43\x87\x60\x84\x37\xc7\x60\x84\xc1\xe2\x8b\x45\xbc\x75\x21\xde\xc9\x12\xe9\x4e\x25\x8c\x02\x69\xbe\x01\x73\xa7\x77\x4a\x3e\x55\x5f\x8f\xff\x10\x07\xd1\x8b\x6c\x9f\x06\x6d\x8f\x6a\xd3\x52\xe5\xaa\x1d\xa8\x3c\x70\x5a\xb1\xc8\x5b\xa1\xcb\xd5\x55\xcf\x41\x05\x90\x70\x58\x25\x7a\x87\xd4\xdb\x1c\x48\xec\x1d\x30\xf5\x36\x47\x12\x7b\x47\x19\x39\x42\xac\x18\x39\xd4\x41\x25\xc0\xeb\x43\x7f\xfb\x6b\xfd\xf6\xd7\xea\x6d\x1b\xd6\x7c\x4c\x94\x0b\xc8\x1b\x6f\x9e\xed\x18\x78\x00\x4b\xce\x32\xe8\x24\x0a\x10\x9b\xb5\xf4\x2a\xe4\xe2\x42\x73\x85\x5c\x10\xea\xb3\x7e\x27\x26\xac\x0d\x58\xc0\x5b\x1f\xa4\x74\xde\xd4\xba\xb8\xd5\x1e\xea\x0e\x96\x71\xba\xe4\xcb\x58\x75\xa1\x96\x9c\x18\xee\xac\xe2\x2e\x88\xb6\x2f\x82\x22\x96\xb0\x92\x0d\xe4\x9b\x09\x9b\x56\xbd\xc2\xd2\xe0\xee\xf7\xf5\xd5\xd4\xa9\x14\x40\xda\xa6\x0a\x4c\x27\xcc\x5a\xe7\x72\xd3\x0d\xd0\x42\xf2\xec\xa8\xad\xf7\x7a\x82\x98\xc6\x2a\x77\xed\xa3\x65\xfb\xb8\x8e\x08\x58\x2b\x04\x75\x37\x24\xe6\xc4\x98\x62\x4e\xff\x1d\x36\x89\xa7\x48\x46\x31\xf3\xf6\x71\x92\xbc\x10\x4b\x2c\x45\xbb\x37\xc7\x82\x25\x0b\xa5\x94\xd6\xbb\x2d\x35\x31\x23\xec\x1e\x9f\x3a\x02\xa4\x34\xb0\xdd\x58\x38\x6d\x52\xac\x28\xa7\x7b\x8e\x13\x1f\xd8\xbc\x6c\x9a\x47\x2b\x27\x36\x5c\x54\x5c\x4a\x43\xde\x0a\x73\x42\x0e\x5a\xb4\x84\xab\xc4\x9b\x27\x8c\xe6\x10\x2c\xbe\x0a\xfa\xc8\x70\x66\xea\x9c\x84\x15\x54\x26\x09\xbc\x77\xc4\x5a\xea\xc5\xfb\xab\xae\x50\x00\x9f\x54\x11\x19\x6c\x5b\xff\xe2\x3d\x0d\x0f\xb8\x1a\x4e\x8c\x8b\x7b\xbf\xb1\xaf\x87\x13\x0f\x0b\x84\x70\xd9\x98\x24\xb5\x6d\x66\xdb\x4e\xa2\xf9\xf2\x59\xf9\xf2\x86\x3a\xfe\xf8\xaf\x58\xfd\x3f\xf2\x9e\x3d\x43\x16\x16\x95\x9a\xf0\xa0\x8f\x85\x07\x1d\xb2\x07\xe0\x81\x82\xd2\x04\x48\x6a\xdb\xf1\x9f\x18\xdd\x63\x61\x97\x3e\x16\x76\xe9\x30\x46\x4d\x35\x12\x2c\x55\x07\xba\x29\x49\x7e\x9b\xe7\x2c\x2d\x55\x85\xeb\x7c\x59\xcc\xb4\xc0\xa3\xba\xa0\x5f\x2f\xfa\x08\x8f\x74\xc3\x68\xc3\xfc\xb9\xa9\x41\xc8\x78\xd7\x9f\x9b\xe6\x56\xf7\x7f\x3b\x34\x6e\x5d\xcd\x8b\xce\xb8\xa3\x98\x49\x9d\x8b\xfc\x18\x9c\x70\x33\x07\x78\xe9\xae\xc1\x88\xf7\xbd\x17\xbd\xea\x13\xfa\x3d\x0f\x4e\xc9\xa4\xc4\x6c\xaa\x89\x1f\xa6\x35\x93\x63\xe9\xae\xaa\x56\x35\x20\xe1\xdb\xce\x22\xfe\x61\x70\x3b\x05\xd8\x1a\x02\x3c\xe7\x77\x6c\x3b\x17\x36\x8f\x14\x03\x1d\xd0\xef\xfa\x45\xe8\xd1\x8e\x89\xfc\xda\x3f\x87\xf0\x01\x00\xd7\xf6\xd3\x50\xd1\xf8\x1a\x9f\xeb\x54\x66\x4f\x12\x54\x4e\x3f\x3f\x72\x65\x0b\x99\xe9\x0b\x51\x5d\x89\xe7\xe0\xfb\xd5\x7a\xc1\x70\x8e\xc2\x54\x08\x33\x93\x04\x67\x53\x04\xa9\x51\x57\xff\x0c\x34\x6b\x48\x72\xb8\x9a\x76\xb5\x2b\x75\x4a\x53\x73\x19\x19\x29\x9c\x12\x8f\x39\x1a\x81\xe1\x45\x4a\xd8\xc4\x9f\x86\x2b\x05\x7c\xde\x53\x0b\xf8\x02\xfa\x7c\x44\x75\xa4\x02\xf9\xb5\xce\x9b\x28\xc7\x1f\xd6\xe1\x74\xbc\xaf\xf1\x10\xae\x2b\x9b\x85\xac\x43\xe1\xcb\x60\xad\xee\x17\x40\x94\xb9\xa8\x63\x1d\xaa\x13\x55\x2b\x3c\x5a\x30\x39\x69\xab\x29\xd0\x80\x6f\x5c\xe1\xbb\x2d\xf2\xca\x54\xf9\x1d\x6a\x3c\xaf\xcd\x9e\x70\x4e\x0a\x27\xe5\x30\xca\x48\xce\x61\x94\x90\x7c\x52\xcb\xc9\x6d\xc9\x82\x6a\x8b\xc2\xc5\xf0\xed\x63\x17\x55\x88\xd3\x3d\x36\x5a\x1a\x11\x12\xf8\xb7\xc8\xf2\x97\x74\xbe\x32\x2c\x7c\x74\x7b\x56\xdb\x96\x6c\x8b\x69\xe4\x2a\x1d\x18\x20\x24\x02\xdd\xac\x66\x0e\x82\xb4\xe7\xce\xd6\xb6\xb7\x5a\x8c\xbc\x0c\xcb\x8f\x99\x6b\x2f\x33\x16\x88\xc1\xcc\xc5\x9f\x8d\xf8\xb3\x14\x3b\x89\x41\x02\x80\x36\xc1\x98\x93\x49\x86\x93\x29\xc2\xd4\xb6\x9d\x4d\xd7\x36\x5b\x6a\x85\x35\xf8\xd5\x80\x4d\x5c\x8f\xf0\x1c\x6f\xf0\x52\xc7\xf2\xb2\x03\x5a\xff\x24\xa8\x34\x98\x08\x80\xb4\xc9\x50\x93\x0e\xe9\xa3\xec\xe0\x65\x2a\xff\x0a\x5c\x08\x24\x4e\x1e\x89\x45\x57\x2d\x87\xb5\xc0\xd7\xa2\x4e\xd6\x5e\xcc\x65\x23\x38\x7e\x4e\xfc\x30\xbf\x20\x09\x10\xaa\x8c\xf4\xec\x5b\x27\xc7\x09\xc2\xab\x49\x3e\xf4\xa7\x64\x52\x4e\x46\xd3\xa7\x8e\x3f\xcc\x90\x9b\x3d\x05\xba\x50\x4e\x7c\xbd\xc4\x9f\xea\x9f\xa4\xd5\x27\xe3\xf6\x27\x6f\xef\xff\xa6\x16\xc5\x72\x32\xc5\x73\x32\x0a\xe7\x1d\x44\x76\xce\x99\x74\x49\x2d\xe9\x64\x3e\xd5\xc7\x17\x8b\x67\x0c\xe5\x7e\xa3\xdc\x9f\x4e\x51\xb8\x15\xd3\x8a\x4e\x87\x56\xa8\x38\xa7\x61\xed\xb0\x55\x06\x6c\xa6\xcc\xd0\x61\x3c\x26\x0f\x97\xad\xb8\x13\x0f\x8b\x5a\x36\xa8\x51\x88\x4c\x2a\x3b\x9d\xe9\x69\x55\xe7\xe2\x36\x37\xf6\x6a\x52\x4e\x11\x36\xf7\xe4\x09\x27\x9d\xde\x88\xe7\x09\xe7\x9f\x9b\xfa\x2a\xce\xf9\xf4\xe9\xb8\x0c\x6b\x1d\xb3\x25\xc8\xa3\x9f\x3a\x6d\xda\x84\x5b\xa2\x97\x41\x22\xa4\xcf\xb6\xad\x7e\xaa\xd8\x8f\x93\xea\x1d\xae\x5e\x29\xb3\xcc\x5a\x58\xed\x91\x4e\x94\x5a\x7a\x72\x10\xb1\x10\x45\xee\xa2\x03\x16\x8f\xbf\x8a\xc7\x63\xc3\xce\x80\xf7\xf9\x3c\xc9\x0a\x56\x94\x1f\xb2\x7d\x8f\x3a\xce\x3f\x1f\x61\x4a\x86\x95\x42\x55\x71\x88\x10\xd0\xa4\xe8\xf2\x77\xaa\x33\xc3\xc4\x93\x74\xca\x49\xbc\x0a\x0f\x2f\x33\xf4\x83\xa6\x54\xca\x1e\xf9\xa4\x00\xbc\x3f\x18\xa1\x18\x9d\x04\x9f\x8d\xa4\x15\xcb\xaa\x8e\xc5\x9a\x48\x66\xf1\x30\x2c\x51\xb8\xba\x10\x56\x42\x2b\x4c\x49\xe2\xc5\xd1\x01\x69\xce\xec\x7d\xf3\x14\x81\x1e\xcd\x13\xb5\xd2\x2f\xd7\x92\x11\x4e\xf0\x0a\x66\xbe\xed\x9a\x74\xad\xbd\xde\x5e\x92\x51\x38\x1c\x6e\x51\xbd\xe5\x3a\xea\x4f\xb6\x6a\x1b\x46\x0a\x4e\xae\x3b\x47\x39\x89\x26\xf3\x29\x6e\xcc\x3c\x47\x10\xd3\x35\xaf\xa7\x8a\xd3\xea\xe9\x38\x64\xd8\xa1\x24\x7e\x1a\xbb\xe9\xd3\x14\x5d\x70\xcc\x5f\x11\xca\x61\x8c\x0b\xb2\x05\x3f\x30\x0e\x09\x85\x0e\xb7\x79\xb6\x0f\x12\x2c\x02\xa9\xbf\x05\x3d\xa8\x3e\xbc\x82\x95\xbc\xb0\x98\x14\x53\x11\xa0\x26\xc8\x4e\x6d\xd0\x7d\x14\xee\x84\x0f\x82\x4e\x4c\xdd\x44\x2a\xce\x4e\x6b\x6c\x5e\x27\x1c\x43\xd7\xcd\x0d\x7e\x6f\xc9\xca\xd7\x6c\x21\x32\x95\xd1\xfc\x38\x73\x72\x08\x04\x0b\x29\xe0\xba\xc0\x9b\x03\x06\x9d\x39\xc5\x25\x49\x14\xb1\x51\xb8\x93\x74\xe3\x97\xaa\xb0\x25\x2b\x05\x5a\xe0\x65\x2e\xd5\xe3\xc1\xb6\x0b\xd7\xbf\xa8\xfa\x93\xee\x68\x09\x28\xf4\x3b\x3a\x8c\x90\x8a\xc5\x1a\x55\x2b\x57\xf5\xc5\xeb\xcf\x2f\x47\xa2\xc6\x86\x38\x65\xfd\x0a\x9d\xcf\xc3\xad\x4b\x36\x4f\x9d\xa8\x5a\xe3\x6a\x48\xe8\x74\xaa\x42\xd5\x97\x17\xfa\xd0\x54\x67\x4b\x3e\xa2\x61\xe7\x88\x96\xd5\x88\xaa\x86\xc3\x65\xdf\x88\x56\xda\xce\xaa\x46\xb4\xec\x1e\x11\x58\x93\xe7\x77\x77\xdb\x0b\x11\xb6\x82\xac\x70\x4c\x72\xfe\x46\x43\xba\xf4\x61\xa4\x8b\x15\xd2\xd1\x06\xd2\xd5\x76\x27\x3d\x2e\x12\x0d\x04\x08\xfb\x32\xd9\xe8\xa6\xb5\x4d\xca\x2c\x04\x3d\x2a\x38\x74\x30\xfb\x6c\x5f\xfb\x74\xe5\x31\xe0\x3c\xeb\x19\x64\x66\xca\x6d\xfb\x4c\x72\xc6\xe2\xfd\xeb\x8c\xef\x13\x47\xc2\xbd\x08\x8b\x5e\x45\xb9\xe6\xa0\x6b\xa1\xab\x6a\xdf\xe8\x3b\x0d\x84\xf2\xa0\xb9\xa5\xea\x57\xea\x2a\xaa\x60\x65\xcd\x77\x17\x5e\x9e\xed\x71\xe1\xd5\xb0\x17\xe6\x7c\xba\xa2\xa7\xb1\x41\x63\x14\x76\xf5\x94\x3c\x24\x3d\xb5\x62\x29\x59\x28\x5c\xd9\x76\x66\xdb\x2b\x23\x2e\xb4\x5c\xaf\xa2\x3c\xcc\x94\x03\x70\x22\x82\x8b\xcd\xea\x77\x1f\xb2\xbd\x12\xf1\x6b\x90\x73\x41\xbf\x75\x2e\x1b\x84\xa1\x75\xba\xae\x1a\x5e\xc7\x9c\x0d\xd0\x4f\xee\xc6\xbb\xc9\x68\x1a\x76\xf8\xe6\xe9\xb5\x74\xfe\x44\x47\xb3\x76\x77\xec\x9e\x4f\x31\xf8\x94\x7c\xdd\xb0\x38\x94\x5c\x69\x05\xfa\x06\xd2\x57\x1e\x02\xb0\x76\x34\x62\xaf\xd9\x8e\x25\xb6\xed\x98\x05\x64\x24\x84\x8e\xba\xae\xec\xf7\xc7\x48\xd5\xad\x0a\x94\x61\x2d\x6b\x74\xca\x25\xbd\x8b\xd1\x15\x0b\xfc\xd1\x90\xc9\xbc\xb0\x23\x3d\x89\x8a\xd3\x1c\x04\x3c\x8b\x1b\x97\x7a\xfc\x8e\x8f\x94\x92\xdd\x75\xcd\x2f\xcb\x43\x02\xe7\x3a\x6b\x05\xc1\x81\x8c\x5e\x21\xe5\x59\xaa\x4f\x0e\xa7\x2d\x11\x13\x9d\xc2\xfb\x98\x4f\x86\x6e\x53\x6d\xca\x24\x36\xbb\x74\x49\x89\x39\xa8\xb4\xa2\xab\xf6\x37\x82\xb4\x3d\x3b\xad\xc5\xb9\x3f\xe2\x12\x36\xc5\xcf\x20\xa2\xad\xb1\xac\xcd\x76\xc6\xaa\x4a\xc5\x97\xee\x31\xec\x58\x22\xf4\x87\x85\x6f\xc5\x0f\x16\x7d\xc8\xf6\xc1\xd0\x57\xeb\xa9\xf6\xc9\x95\x58\xe6\xc0\xdc\x3c\xaa\xcd\xe7\x46\x8b\x43\xbb\xfe\xa1\xae\x2d\xa3\xfc\x35\xf6\xa5\x0c\x83\x54\x59\x23\xeb\xaa\x61\xb5\xcb\x1e\xa2\x92\xe8\x96\x3e\x56\x9b\x27\x71\xc5\x1f\xf6\x5c\xd8\x37\xfa\xaf\xa3\xd4\x41\x8c\x38\x4b\xd8\x35\x8b\x38\xd2\x0f\x8d\xed\x3b\x33\x0b\x86\x25\x74\xf4\x71\xc3\x17\xc7\xc8\x1b\xa4\x23\xb0\x81\xe3\x61\xfc\x14\xd2\x76\x34\x15\xb2\x96\x9b\x7a\xb9\xc8\xc7\xea\x2d\xe5\xdf\x1b\xf8\x1b\xbb\x16\xb2\x64\x8b\x47\x28\x39\x4d\x59\x63\x96\xb3\x34\x62\x39\xc4\x56\x5c\xd1\xbc\xb2\x4d\xd5\xc8\x25\xa6\xa8\x66\x17\x56\x9d\x81\x3d\x2e\xc9\x48\xb9\x45\x8f\xd4\x09\xd2\x30\xb2\x0e\x45\x6e\x3e\x3f\x64\x17\x59\x4b\x3a\x2b\xfa\xac\x2a\x3a\xe2\x34\x5a\x38\xe3\x44\x31\x2c\x2e\x73\xdb\x76\x72\x52\x88\x23\x45\x1e\x43\xed\xb1\x85\x3a\xc6\x24\xc3\x7c\xe8\x43\xf8\xbc\xdc\x1d\x37\x00\xa3\xa6\x57\x63\xac\x1c\xa7\x62\x68\x56\xa4\xf1\x7e\x32\x9a\x56\x9c\x0f\x9f\x1e\xf5\x0a\xba\x13\xca\xba\x8a\xea\xb7\x7a\xab\x67\xbd\x6d\xf5\x27\xbc\xb2\x65\x3a\x92\x6d\xc5\x1d\x29\x36\xf1\x4b\x80\xb4\xf5\x52\x7e\x4e\xe3\x79\xef\x51\xdb\x1f\xad\xb3\x6e\xbd\x69\x38\x92\x08\xd3\x85\x89\x78\x3d\x0d\xe7\x77\x77\xce\x9c\x1c\x54\xc8\x41\x15\x88\x04\x61\xea\x25\x2a\x06\x63\xdf\xa8\xb5\xd0\x8a\xf5\xf7\xa8\x27\x8a\x05\xe6\x6f\x8c\x7d\xb0\xc1\x73\x9d\x05\xe0\xff\x88\x66\x98\xe2\x15\xae\xa0\x85\x37\x38\xc2\x5b\x29\xb9\xd1\xa6\x91\x5f\x47\x50\x9a\xa6\x31\x8a\xce\xb0\x74\xc7\x41\xaa\x57\x8c\x4c\xa6\x92\xce\x08\xe6\xed\xcc\x17\x8a\x9d\x12\x76\x44\x79\x66\xd2\x58\x10\xc1\xaa\x58\x29\xaa\x94\x94\x61\x47\x20\x8c\x3e\x99\x46\x29\xa6\x3a\x45\x16\x90\x8b\xcb\x61\xb7\xb8\x93\x02\x55\xca\x20\x59\x69\x76\x91\x57\x4a\x8e\x7c\x92\x4d\x39\xb8\xc0\xe2\x45\xec\x46\x5e\xa4\xb2\xa1\x16\x32\xc1\x70\x13\x9b\x55\x10\x8f\x2a\xf9\xba\xd8\x85\xa3\x30\xa9\xfa\x0e\x5d\x37\xa9\xbb\x4c\x00\xb9\x8b\xea\x53\x8f\xeb\x5f\xda\xdf\x28\x91\xc5\x80\x1c\x4c\xa5\x13\xa4\x43\xdf\xf0\xb4\x6c\x6d\xc2\x2b\xed\xd8\xea\xda\xd5\x87\x1d\x4d\xf4\xa3\x8d\x0c\x7d\x6c\xa4\xe4\x69\x93\x49\xf9\x42\x1b\x8d\xf1\x9a\x30\x84\xf5\x04\x3f\xf2\x0e\x0d\x78\x7b\x78\x4f\x11\x8e\xfb\x58\x1f\xd1\x10\xe1\xb8\x43\xa2\x79\xb7\x2d\x3b\xb8\x80\x8e\xfd\xde\x11\xa8\xd4\x52\xd7\xd5\x8f\xad\xae\x6f\x40\xe5\x7a\xd0\x92\x43\x3a\x43\xf1\xf2\x4f\x9d\x35\xe6\xac\xcc\x97\x1b\xec\x51\xc7\x35\x60\xc7\x86\xac\x59\xf3\x26\xc7\x13\xb1\x8a\xe7\x51\x5a\x74\x0d\xce\x2a\xc6\x54\xc5\x6e\x3d\xe6\x5c\x1e\xfa\xa6\x2d\xf8\x97\x5c\x2b\xe2\x26\x4b\xdd\x14\x58\x2a\x03\xc5\x1a\xd7\x9a\xd8\xdc\x85\x50\xed\x78\x1c\xcb\x4e\xca\xa5\x05\xfb\xae\xbf\x29\x83\x7d\xb7\x36\xc6\x85\x5f\xa7\x09\xae\x4d\x9f\x47\x61\x79\x1f\x55\x2a\x35\xf5\x5c\xa7\x28\x0d\x76\x6e\x90\xb9\x93\xe9\x99\x3b\xe3\x05\x84\x37\xf5\x0e\xa4\x73\x0f\x56\xe1\x3b\x78\x9d\x38\x3a\x84\x6a\x64\xad\x59\xff\x60\xf2\x63\x7d\x1a\x56\x03\x7e\xcd\x50\x26\xba\xb0\xdd\xd7\x41\x8d\x46\x66\xeb\x24\xa3\x91\x34\xd7\xee\xd8\x8b\xca\x29\x4b\x9e\xa5\x34\x2f\xd8\xf3\x8f\xbf\xcc\x2a\xe7\x57\x89\xbf\xbc\xce\x8b\x38\xfa\x19\x36\xbf\xe8\x4b\x3b\xb5\x20\xd2\x5c\x73\x6f\xd0\x28\xfa\xfc\x29\x9e\xff\xde\x61\x20\x1b\x4a\x13\x59\x3d\x78\xc0\xa4\x59\x02\x17\x06\xcd\x32\x7f\x3a\xed\x8c\x2a\xa0\x0b\x77\x1d\x71\x27\xd4\xad\x1e\x73\x2c\x11\xac\xd2\x42\x4e\xa9\x6e\x24\x70\x5b\xc3\xed\xed\xb1\xf0\x8d\x90\x3b\x4b\x53\xe4\x88\x39\x39\x4d\x9b\x7e\xbe\xd0\xc2\x90\xfc\x79\x42\x8b\xa2\xd7\x96\x58\x72\x9e\x11\x2d\xa9\xac\xaf\xb4\x21\x5d\x6f\xa4\x32\xa4\x8a\x48\x77\xd5\x43\xd5\x20\x54\xe5\x77\x10\x0c\xf2\xea\x95\x32\x31\x0b\xde\x54\xbf\x7a\x9a\x89\xd0\x95\xb2\xdd\x4f\x0f\xd5\xd6\x3f\xf2\xa9\xaa\xfc\x52\xfd\x32\xe1\xa1\xb0\xa2\x7d\xeb\xaa\x32\x11\x84\x6a\x71\x69\x6d\x81\xcf\xf6\x95\x38\x63\x40\xb3\xba\xc0\x53\x0b\x21\x1d\xfb\x6b\x83\x0d\x65\xc9\xab\x22\x1d\xb0\xda\x4f\xad\x19\x12\x51\x99\x98\x7e\xa9\xbb\x45\xdb\xcb\x4e\xb1\xd4\xad\x36\x7a\xb9\x42\x2c\x98\x78\x64\xf8\xa7\x19\x0d\x5b\xbd\x18\x33\x36\xa2\xb8\x99\x96\xb5\x8e\xb9\x55\xab\xa3\x46\x2e\x81\xf2\x80\x34\x02\x47\x90\x09\xa7\xd0\xba\x2a\xa8\x4a\xc2\x50\x7b\xb6\x3a\xa8\x15\xa3\x49\x5f\x2e\x08\x00\x41\xe7\xa5\xb2\x02\xd6\xc9\x09\x66\x2d\x47\x6d\xb9\x95\x34\xd3\xd5\x4b\x1f\x74\xa9\xed\x8e\x79\x9d\x38\x5d\x5e\xef\x58\x4e\x97\xcc\xa1\xad\x40\x8f\xed\xce\xbb\x26\x29\xd8\x34\x2a\xc5\x4a\xfd\x62\x4c\xf2\xc5\x0d\x54\xcc\xe9\x3e\x4e\x97\x9f\xe2\x35\x7b\x53\xcc\x48\x3c\x04\x94\x06\xa2\xff\xe9\xb8\x61\x32\x88\x1d\x7e\x2f\x82\x0d\xaa\xf3\xb1\x79\x3b\x5b\xdf\x10\xa4\xe2\xfa\x38\x17\x7f\x32\xf1\xa7\xe0\x07\xa6\xe0\x44\xcb\x16\x27\xba\x22\xe5\x24\x99\xe2\x2d\x59\x01\x93\xa7\x39\x87\x4f\xb6\x53\x88\xb7\xbd\x9d\x56\xf9\xfe\xc9\x0a\x98\xd3\x50\x08\x64\x11\xaa\xd2\x9b\x46\x57\xc2\x00\x99\x90\xf8\x2a\x22\xa3\xc0\x39\xd3\x35\x44\xea\xda\x80\xa1\x3a\xf2\x37\x61\x7a\xde\x6a\xd7\xa5\x60\xd4\x2f\x06\x2c\x05\xbe\x92\x9f\x73\xfc\x7b\xc8\x48\x0d\x2e\x8a\x6e\x0b\xb8\x90\xe1\x05\x8a\x25\x76\x12\x88\x3b\x0c\xda\x51\x31\x9c\x33\x12\x5f\xe5\x50\xdf\x75\x32\xf8\x3b\x14\x8f\xe8\xa9\xe3\x6c\x87\x39\x4c\x19\x9d\x3b\x19\xfc\x50\xcf\x28\xc8\x6d\xdb\xa2\x49\x02\xd3\x11\x0d\x82\x4c\x2b\x12\x5d\x05\x23\x14\xe4\x64\x15\x0a\xed\x3f\x87\x53\x98\x9e\x91\xad\x6d\x3b\x73\x97\x44\x18\x00\x37\x47\x38\x25\x5b\x2c\xc0\x36\x93\x0a\x69\x32\xc7\xf3\x4b\x3a\xf1\x39\x78\xf9\x1f\x5e\x6b\x7e\x41\x27\x23\x51\x30\xe2\x05\x4d\x95\xac\x19\x96\xa5\xcb\x5a\x48\xbf\x56\xe3\x1c\x54\x75\xc5\x8e\x23\x72\x7b\xe2\x72\x6f\x7d\xa1\x06\xc2\x39\x99\x87\xf4\x92\xf8\x21\x1d\x0e\x91\x62\x1d\x0d\x3b\x7d\x3a\xf4\xa7\xb0\x78\x8c\x43\x1b\x20\x2d\xee\x31\xe0\x62\x7d\x29\x0c\x6e\x78\x57\x26\xd6\xc5\x64\x14\xc6\x17\x85\xee\x43\x50\x4c\xe2\xe9\x64\x34\xbd\x24\x1b\xb1\x92\x44\xc4\x29\x4f\x49\x8c\xb0\x7c\x77\x41\x96\xa0\xbe\x88\x51\x68\xd4\x18\xd5\x17\xed\x0b\x92\xe2\x19\x39\x1b\x85\x33\xdb\x5e\x5c\x8e\x42\xb4\x18\x0e\xb1\xe0\xfb\x08\x21\xc5\x64\x01\x51\xe7\xe4\xa3\x54\x86\x54\x73\x16\x18\xbc\x23\x39\x74\xa7\xba\xd9\x5d\x68\xd7\x8c\x68\xe7\xba\x7a\x7f\x3b\xe8\x6f\x71\xa6\x86\xb2\x40\x78\x77\xa6\x7a\xde\x21\x9c\x00\x84\xc8\x24\xc5\xf9\x14\x17\xa4\x90\x59\xf8\x53\x9c\xbb\xbe\x94\x03\x05\xd8\xaa\x9a\x23\x5c\x7f\x4e\x00\xf3\xd8\xa9\x1c\xe2\x6d\x0e\x1d\x44\x6a\xc9\x4a\xc9\x7f\xfc\x2a\x4c\xbd\x9d\x42\x51\xbd\xae\xeb\x0f\xb6\xe1\x87\x95\x85\x8f\x08\x22\x60\xb7\xba\x13\xf7\x17\x9f\x32\x41\x57\x9c\x02\x1f\xe5\x48\x21\x08\x41\x6f\xb7\xfa\xad\x8a\x6d\x3b\x59\xdb\xed\xc6\xf4\xd5\x38\x6a\x3a\xf3\xed\x24\xe3\x58\xce\xff\x90\xc9\x14\x35\x28\x9b\xb3\xc6\xfc\x0d\x3e\xf4\xcf\xa9\xfe\xf8\x5b\xfa\xf6\x55\x9c\x24\x16\x42\x08\x47\x93\xe3\x94\x1c\xf0\x6a\x42\xa7\x64\xad\x2e\xc8\x04\xaf\x1d\xac\xb0\x8a\x53\x14\x44\x58\xbb\x2f\x08\x92\x0e\x73\x5e\x41\xad\xfb\x39\x88\xda\x76\xcb\x3c\xe0\xc3\xce\xd2\x4a\xb8\x52\x3c\x84\x70\xd9\xbb\x4e\x12\xb5\x95\xab\x68\x97\x95\x6b\x97\x63\x44\x82\xf5\xaa\x8c\x26\xc4\xfb\xfa\xe9\x17\x28\xbc\x4c\x27\x92\x87\xa3\x3a\x35\xd9\x5e\xb8\xb6\xab\xcd\x0f\x68\x15\xec\x49\xcc\xd4\x08\x3a\x4b\xf5\xc7\xbe\xf8\xb3\x75\x62\xf3\x4e\x94\xc7\x19\x19\xe1\x82\xf8\x61\x51\x9b\x39\x14\xae\x8b\xda\x64\xa9\x18\x02\xe5\x34\xe0\x4a\xa3\x48\xce\xce\xc9\x27\xc5\x14\xc7\x93\x62\x8a\x3a\x22\xde\x4e\x8a\x29\xc9\x5c\xb7\xa6\x29\xc2\x56\x22\x6f\x7d\xb1\x31\xfe\x09\xef\x75\x4a\x8a\xda\x12\xaf\x23\xbe\x55\xd3\xba\xb7\x60\x25\x70\x85\xf2\x5e\x88\xf3\x87\xb5\xa7\xbb\x94\x53\x1a\x01\x05\x3c\xb6\xa3\xc9\x16\x52\x8b\x29\x7f\xd1\x34\x62\xb9\xe4\x21\x58\xad\x62\xd0\xc3\x01\x72\x01\x63\x1d\xa7\x4b\x3e\x52\x15\x94\x24\xa9\x19\x0d\x95\xc0\x17\xf2\x0c\x3e\xd8\xdc\xb5\x06\xc3\x41\xb5\x13\x82\x81\xe5\x3a\xc9\xb0\x44\xae\xb5\x2e\xac\x56\x94\x37\x6d\x70\x0f\x5f\xbc\x80\x7a\x00\x94\xea\x56\x83\x4d\x15\x9a\x03\x53\xa2\xea\xd4\xc0\x98\xd9\x66\x2c\x14\x32\xdb\x66\x0d\x25\x68\x2f\x3b\x6b\x5a\x5b\xe3\xaa\x81\xda\x29\xb7\x82\xcb\x0e\x0c\x06\x59\x32\x68\xd2\xa3\x20\x68\x7e\xe0\x14\x76\x4e\x15\x7c\x11\x72\xba\x17\xb3\xad\x2c\xd6\xab\xf9\x0a\xc0\xf5\x31\xd1\x51\x1c\x75\x34\x6e\x69\x3f\x94\x63\x7c\x33\x75\xe2\x17\x5e\x08\xf5\x41\x5b\x4f\x66\x65\xa4\xc2\x8e\x6d\x3b\x6e\x2a\x9e\xb9\xe8\x0e\xbc\x9d\x44\x5a\x1a\x1d\x5f\xc5\x39\x8b\xe0\x9c\xd5\xca\x52\xed\x12\x21\x34\x6c\x57\xeb\xf7\xc2\x45\x3c\x95\xce\xc4\x0d\xe5\x97\x2e\x6c\xb5\xa8\x34\xe7\x86\xc3\x6a\x14\x22\x9c\xdc\x64\x8a\x35\x7d\x8d\x7e\x48\xa5\xdb\x35\xec\x4e\x04\xfa\x1a\x46\x6e\x97\xb0\xbc\x5a\x94\xee\xb6\x40\x01\x27\x9b\x0c\x09\x0d\xf1\xe6\xeb\x2f\x4d\xca\x29\x61\xe2\xeb\xda\xf7\x74\xe3\xbb\x52\xa8\x78\xc4\xe5\xd7\x7d\x8a\x83\xa3\xe5\x3a\xe5\x95\x35\xb6\x02\xcb\x42\x08\x3b\xa0\x44\xa8\x8d\xf3\x2c\x84\xaa\xcb\x66\xf9\x65\xdd\x74\x8f\xa2\xda\x87\x55\x2e\x6f\x2b\xa0\x25\xac\xe1\x71\x0c\xb2\x10\xff\xa1\xb5\x7f\xa0\xef\x53\x2b\x28\x10\x07\xe2\x7d\xaa\x87\x16\xbc\x1b\x3a\x9b\x43\x5c\x3c\xe4\xb6\xda\x8a\x12\x38\x79\x80\xe5\x28\x9b\x01\xd3\x3a\xe8\x75\xb7\x25\x5e\xed\xb9\xd3\x35\x02\x21\x98\x18\x09\xf3\xd1\x49\x5a\xc4\x76\x4f\x56\x0a\x5e\x45\x98\x28\xb1\x76\xa5\x47\x14\x04\xd1\xab\xd5\xba\x3b\xe4\x14\x88\x37\xf7\xd6\x8d\xd3\x79\xb2\x8d\xd8\x6f\x2c\xcf\xa0\xfa\xfc\xa1\xea\x11\xdb\x70\x52\x94\x96\x70\x1a\x09\xd7\xe8\x76\x1b\xc1\x27\xaa\x66\x10\xfc\x11\x92\xf2\x78\xbe\x14\x08\x7a\xf8\x92\x63\x1d\x33\x53\xa3\x1f\x1b\xb0\x27\x3c\xf3\x71\x4a\x36\x5d\xa1\x34\x57\x08\x4c\x06\x14\x17\x80\x56\x46\xd4\x47\xce\x44\xfb\xd2\x4b\x5b\x2d\xda\x12\x2f\xf0\x0c\x0c\x09\x77\x64\xc8\xff\x1c\xc9\x28\x3c\xd6\x7c\xc4\x11\x42\x26\x36\x5d\xd3\x26\xc7\x29\xc7\xf5\x25\x29\x27\xfc\x37\x98\xe2\xca\x21\x72\x51\x64\x46\x2a\xc7\x9d\x25\xe6\xc2\xbe\x7c\xe7\x2c\xaa\x06\x3e\x74\xb0\x93\x15\xe9\xc1\x59\xe0\x1d\x42\x28\x8c\x6c\xfb\x8c\xcb\x81\xb3\xcb\x11\x74\x34\x42\x78\x07\xc6\x16\x3b\x32\x42\x08\xcf\x08\x1f\x6b\xf5\x86\xc0\x98\xe1\xad\x8f\x30\x25\xbb\xe1\x0c\x00\x40\x6d\xdb\x19\x9d\x11\xb2\xbb\xa2\xb5\x6d\xe6\x0e\x05\xbc\x1e\xa6\x44\x99\x7f\xac\xc9\x0e\xdf\x90\x19\x98\xaf\x6f\xaf\x9c\x35\xd9\xb9\xe9\x53\xca\x8b\x50\xa0\x3f\x0d\xe1\x2f\x1f\x86\xbc\x27\xba\xe1\x5f\x5f\xf3\x21\xee\x2e\xa0\x60\xcd\x47\x87\x70\x13\xde\x37\x78\x3d\x3d\xc5\x0b\x67\xa5\x13\x09\xc0\xe4\x3d\xc9\x8c\x52\x2e\x36\x5c\x99\xcd\x27\xa3\x69\xd0\xa8\x82\xaf\x9b\xcd\xfc\x76\x33\xbf\xd1\x4c\xb8\x76\xb4\x42\x6b\x92\xc9\x1e\x5f\x4f\x85\xac\xd5\xf9\xde\xec\x56\xb8\x0a\x42\x48\x7c\x74\xbb\x27\x5d\x2d\xc4\x00\x3b\xdf\x48\x91\xed\x1d\x49\xcf\x9d\xf1\xd3\x74\xe8\x23\xfc\x82\x38\xfc\xaf\x7a\xee\x1c\x23\x17\xe8\x3b\xa2\xff\xed\xf1\x35\x7e\xc7\xa1\xdd\xf9\xa5\xbe\x16\x2f\xa4\x60\xf9\x27\x06\x8f\x29\xb9\x1e\xee\xbb\x3f\x38\x9a\x92\xfd\x90\x3e\x4d\x7b\x87\x73\xed\xd2\xa7\x29\x98\x33\xa2\xdb\x95\xd7\x24\x1c\x64\x0e\x90\x79\xf9\xc0\x99\x96\xd4\x67\xda\x6b\xf2\xb2\xd6\x8b\x87\x2b\xaf\x84\x6e\x5e\x3b\x7d\xb3\xea\x9b\x53\x17\xfd\xc0\x2f\x05\x5f\x87\xf3\xbb\x3b\x27\x27\x2b\x74\x3a\xe9\x86\x27\xb9\x88\xce\xff\xe4\x79\x96\x2e\xe2\xa5\x8c\x66\x21\x02\x9e\x07\x83\xeb\x72\x90\x30\x5a\x94\x83\x2c\x65\x03\x88\x7e\xbe\xa2\xc5\xa0\xcc\x06\x2b\xba\x63\x83\x72\xc5\x06\x6d\xaa\x39\x10\x13\x1e\xa8\xd4\x10\x91\xf7\x24\x34\x2f\x80\xfb\xa9\xbf\x70\x9d\x69\x01\xb4\x3e\x90\xfe\x2c\x4c\xf1\x27\x92\x0b\xa8\xe2\x8f\x24\xef\x86\xde\xb0\xb3\x7c\x34\xc5\x3f\xf5\xe1\xd0\xb0\x6f\x7d\x9e\x73\x46\xeb\x0d\x19\x85\x6f\x2e\x3e\x29\xb2\xfb\x46\xcd\xf9\x2d\x71\x3e\x4d\xde\x4c\xbd\x5d\xdf\x07\xd1\xf9\x47\xfc\xaa\x0f\xa3\xdd\xb7\x4f\x7f\x0a\x9f\x0b\xc5\xea\x2b\x74\xfa\x97\xe0\x0a\x7e\x8e\x4e\x4d\x6d\x00\x24\xda\xff\x74\xdc\xb0\x57\x79\xb6\x16\x02\x53\x97\xa5\xec\x19\x04\xd2\xa8\x22\xf0\x5b\x43\x0b\x85\x94\x53\x55\x8b\x59\x67\xa4\x04\x7d\x8a\x6d\x5b\x2f\xab\x07\x70\x2d\x57\xb5\xcf\x2d\x74\x49\x46\x77\x77\x5d\x8c\xc5\x15\x3f\x66\x83\xbf\x92\x4a\x73\x67\xdb\xe5\xa5\xe5\x7f\xfb\x97\xd1\xc8\x1f\xf9\x96\x6d\x97\x17\xd6\x78\xf4\xec\x2f\xfe\xf8\x19\x7f\x72\x58\x7d\xd5\x5e\xb0\xf2\xf3\x75\xcd\xaa\x72\xd1\xb1\x65\xd4\x61\x54\x30\xc5\xb7\x2b\x3d\xe1\x8c\x77\x00\x30\xfe\xc4\xc7\x96\x93\x03\x28\x09\xc4\x83\xa1\xa8\xe0\x18\xed\x1d\x04\xcd\xae\x73\xfc\x1f\x3a\x12\xff\x77\x35\x13\x68\x4b\x76\x50\xfd\x13\x3c\x74\x55\x83\x1c\xbc\xf4\x86\x25\xcd\x2f\x5c\xb7\x5e\xa0\xa0\x7f\x12\x1d\x9c\x9d\x01\xfa\xd3\x23\x66\xd6\xc5\x9f\x76\xb6\xab\xa6\x96\x0a\xee\x08\x36\xf8\x23\x27\xf7\xe0\x30\x1a\xcb\x5a\x5d\xa6\xb6\x11\x95\x33\xb6\x90\x87\x8b\x43\x0c\x70\xfb\x75\x9c\xb2\x17\x2c\x89\xd7\x71\xc9\x72\xe1\x42\x50\x7a\xc5\x26\x89\x4b\x27\xbd\xbb\xb3\xfe\x33\xad\x23\xf1\xb4\x54\x06\x91\x6a\x67\xa1\x70\xe8\x13\xf0\x2f\xac\xb0\x3a\x43\xb6\x6d\x14\x58\xff\x59\x02\x9e\x83\xb6\x10\x1e\x42\xa5\x7c\x51\x0a\x20\x95\xb4\x45\x13\x55\xee\xee\x9c\x82\xf8\x06\xa4\x44\x65\xf1\x35\x31\xd2\xac\x23\x3c\x6f\xce\x00\x0e\x52\x16\x40\xb5\xb6\x27\xc1\x2b\xbe\x5f\xb7\x9d\x1a\x28\xe5\x3e\x13\xf1\x2a\x73\x52\x84\xf3\x5a\x2f\x34\x57\xa4\x6c\x43\xf2\xc9\x1c\xa8\xf6\x1c\x73\xe6\x6c\x53\x6d\x4d\xeb\xdf\xac\x33\xb2\xe1\xc4\x4c\xba\x0c\x6c\xaa\x11\x0a\xbf\x89\xa5\x32\x29\x18\x4b\x1d\xcd\x42\xfa\xbf\xad\xd4\xed\x60\x27\xc9\x71\x96\x10\x55\x36\xe9\x15\xd4\x75\xcc\x86\xc4\x8c\x9c\x0a\x2c\xf8\x91\x9e\x40\x5b\x79\x18\x96\xe6\xb5\x2e\x12\x77\x00\x7e\x48\x2f\x96\xba\x0d\x02\x23\xcb\x09\x55\xc0\xe5\xe4\x09\x8f\xcf\x88\xb2\x52\xb8\x72\x94\x32\x09\x2e\x66\x9d\x27\x55\xc6\x50\xd5\x31\x4d\x06\x56\xba\x5d\x9f\x47\x2c\xb5\x06\x80\xaa\xc5\x20\x4e\x07\xcf\x3f\xfe\x32\x88\x68\x49\x21\x93\xe8\x22\xdb\xa6\xd1\x80\x8a\xd7\x83\xff\x7c\xf2\xc4\xe5\x9f\x74\xad\x27\x83\x2c\x1d\x24\x71\xca\x06\x96\xeb\xf8\xee\x1c\xb9\xd6\xc0\x79\x62\xb9\x1b\xd7\x7a\x82\x06\xfb\x55\x3c\x5f\x0d\xe2\x62\x90\x66\xe5\x20\x5b\x00\xb6\x0c\x16\x59\xbe\xf6\x2c\x3e\x5d\x0a\xea\xf5\xd1\x14\x05\xe2\xf7\xc1\xab\x77\xf4\xcc\x81\x73\x61\x8e\x37\x08\x37\xcb\x7d\x51\x2e\x24\x8a\x81\x66\x77\xdb\x7f\x13\x0d\xa0\x53\x40\xfb\xf7\xf1\x19\xf1\x6d\xdb\x84\x4b\x9d\x49\x95\x26\x25\xcb\x53\x0a\xa9\xe7\x1c\x98\x30\x1e\x14\x65\xc4\x76\x1e\x1a\x6c\x68\x9c\xb7\xa1\xd3\x00\x00\x67\x3f\x68\x3a\xc8\xa2\x3a\x2b\xeb\x42\x01\xd6\xb1\xdc\x6a\x1c\x43\x1f\xb9\x16\x0a\x06\x12\x5e\x60\x7a\xd0\x58\x5c\x32\x46\x8b\x89\x43\x21\x76\x55\x0b\x42\x7c\x09\xba\x20\xb4\x9c\x50\xf7\xb1\x30\xd2\xef\xf6\xfb\xf0\x0b\x30\x7f\x06\x48\x16\x9e\xff\xdf\x83\xa7\xff\xd7\xb9\x57\xb2\xa2\x74\x66\xe8\x4a\x2c\x5c\xed\x0c\x0e\xd7\xc5\x81\xc3\xc8\x4c\xa1\x63\x68\x21\xfc\x8c\xd4\xe8\xf8\xa7\x96\xba\x55\x3e\x96\xd3\x0b\xd4\x22\xee\x69\x9e\x3a\x4f\xfe\xbe\x62\xe9\x60\x5b\xf0\x95\xab\x27\x86\x15\xec\x55\xfe\x1b\x16\x97\x2b\x96\x0f\x6e\x12\x9a\xfe\x3e\xc8\xf2\x81\x95\x64\xfb\x70\xce\xd2\x92\xe5\xe1\x2a\x5e\xae\xac\x41\xb9\xdd\x24\x7c\xb1\x20\x81\xee\x13\x77\xe6\x3e\xb1\x2a\x44\x7f\x22\xd6\x19\x69\x66\x83\x1d\x30\x83\x69\xf6\x2c\x17\x58\x56\x57\x3a\x35\xdb\xe6\x1b\xff\x22\x9e\xc4\x46\xc6\x08\xf0\x6c\x06\xb2\x50\x25\xba\xdd\xb6\x70\xf6\x6d\x85\x5e\x22\x86\x17\xa0\xa6\xc4\xc6\x39\xdf\x8a\x96\xab\x9a\xbb\x16\x1a\x44\x19\x13\x7b\x91\x2e\x73\xc6\x44\x3e\xc5\x1a\x43\x05\x51\xe5\x6d\xb6\xbc\xb2\xe5\x6e\x84\x54\x3f\x57\xf1\x60\x4c\xda\x2b\xd0\x62\x47\xce\x46\xf2\x6e\x72\x14\xee\x6c\x9b\x5e\x2c\x9a\x60\x00\x31\xf9\xcc\x17\x81\xda\xd1\xad\xb1\x62\xd6\xa7\x15\x53\xf9\x1d\x8b\xc1\x13\xd1\xf7\x13\xc5\x9d\xc7\xc5\xa0\x60\x25\x86\x3d\xc6\xf9\x78\x88\x97\x38\xc8\xb3\x3d\x1f\x6e\xb5\x03\x6b\x7a\x43\x37\x1b\x46\x73\xe0\xfd\x69\x52\x64\x83\xb9\x08\x86\x2b\x67\xe6\x0d\xfe\x1e\x27\xc9\x20\xca\xb3\x0d\xf4\xc6\x3b\x90\x73\xa6\x69\x34\xd8\x16\x42\x58\x90\xdf\x96\x6d\x2c\x14\xf2\x5e\xe2\x74\xcb\x4e\xa7\x58\x70\xb4\x8b\xda\xa3\x6b\x10\xd9\xb6\x63\xce\x88\x77\x1b\x17\x83\x6c\x0b\x24\x2f\xcb\x23\x96\x87\xe2\xcf\x20\x2e\x07\xf3\x2c\xcf\xd9\xbc\x4c\x8e\x7c\x90\xc5\x86\xb1\x68\x90\x64\x34\x8a\xd3\x25\xa7\x89\xb1\x57\x64\x79\xe9\x74\x47\xd8\x9e\x8c\xa6\x43\xbe\x53\x4e\xa8\x65\x45\x09\x68\x06\x69\x88\x5b\x9e\x3f\x22\x6f\xa3\x99\x29\xa3\x81\x45\xcf\x69\xfa\xa4\x1c\x70\x2e\x7b\xc0\xd6\x9b\xf2\x28\xc0\x5a\xb0\xd2\x12\x1a\x94\x2a\x4f\x4a\x1d\x84\xbc\xa7\xa7\x17\xb2\xe1\x60\x2e\xd3\xa8\xc9\x05\xa0\xa9\xec\x39\xcf\xf6\xaa\xd3\xcc\x29\xe5\xed\x81\x9e\xfb\xaa\x13\xd1\x38\x7e\x99\x40\xfe\x19\xf6\xb8\x34\x92\xa9\xd6\xf7\x23\x53\xbf\x07\xec\xb0\x49\xe2\x79\xcc\x01\xbd\x8b\x69\x8d\x59\xc0\xb3\xa8\x45\xd6\xf2\x64\x59\xa8\x8b\x69\x99\x58\x9f\xad\x29\x96\x56\x2f\xf5\xec\x45\x42\x8f\x56\x75\x81\x1d\xd6\xaf\x96\xab\x62\xa2\xdc\xc3\xe1\xd4\xde\x67\xb4\xdb\xd9\x00\x72\x9b\xa9\xad\xff\x30\xe8\xdf\xc4\xc5\x9a\x96\xf3\xd5\xe0\x86\x95\x7b\xc6\xd2\xce\x8d\x4d\xf9\xc6\xe6\xc8\x9e\x76\x11\x0e\x91\x38\xdc\xb1\x5c\xed\x6b\xae\x85\xe4\x82\x9d\xa4\x23\x65\x95\x3e\xbd\x14\x59\x70\x90\xbc\x3b\xfa\x3f\x54\xa6\xa8\x82\x9a\xcd\x93\x2c\x65\x1c\xe7\x84\x17\x07\x78\x37\x18\xfe\x0c\x12\xcb\xe3\x09\x7b\x00\xd4\x1f\xb2\xbd\x38\xed\x19\x3f\xed\xb3\x85\xd8\x2f\x71\x21\x70\x5c\xdb\x34\x12\xa9\x63\xe1\xe5\x76\x77\x67\xa9\xbd\x59\xa7\x79\x97\xef\xf8\xc9\xfc\x29\x5e\x33\x25\x55\x36\x8a\x1d\x84\x7a\xc6\x72\x90\x2c\x59\x9c\x02\x5d\xac\x87\x25\xb9\x2e\x0a\x17\x8a\xd5\x98\x44\xb7\xa4\xd5\x7d\x95\xcb\xe2\xd4\xbc\x0a\xf8\xdf\x2b\x4c\x1d\x3c\x81\xa9\xed\x75\xc5\x4d\x4b\x42\xbe\xb9\x38\xfd\xf9\x44\x6f\x92\x6e\xff\x58\xa9\xee\xbe\x61\xf9\xbb\x45\x65\xbb\x06\x9a\x00\xed\x85\x48\x02\x05\x21\xd9\x45\x48\xcf\xed\x3a\xe5\xec\xbd\x33\x82\x2d\x69\x71\x2c\xb3\x08\x89\xef\xee\xe0\x67\x19\xaf\xe1\x11\xfd\xcf\x97\xbe\x85\x82\x9e\xcf\x51\xc0\xdc\x3a\x83\x69\x35\xd2\x0b\x66\x69\x72\x1c\x3c\xe1\x3d\x3c\xc1\xe2\x2f\x07\xc1\x13\xa0\x2a\x4f\x44\xc3\x27\x03\xbe\x22\xc5\x80\xe6\x6c\x50\x6c\x37\x9b\x2c\x07\x71\x23\xcb\x25\xb1\x19\xf8\x7c\xd3\x54\x6b\x35\x80\x10\x9d\x03\xe7\xfb\xac\xe4\xac\x70\xcc\x8f\x72\x4b\x23\xa0\xff\xdf\xd5\x04\x80\xd7\x97\xb8\xb8\x9a\x4c\x71\x41\x6e\x4f\x38\x21\x67\xbe\x34\xd0\xf2\xc3\xf4\x82\xd5\xd9\x63\x57\x2d\x8c\x14\xde\x30\x6a\xb5\x08\x59\xa1\x4c\x1c\x41\x29\xaa\xd7\x52\xe6\xe3\x3e\x23\xab\xbb\xbb\xb3\x1e\x21\x40\x86\x12\xbd\xd6\x33\xc1\xb7\x57\xfe\x1d\xac\xbc\x5a\x62\xce\x9b\x55\x6b\xcb\x05\x9e\x41\xa5\x0e\x85\xe5\x17\xdc\xe5\xf7\xbb\xf8\x0f\x6f\xf0\x44\x0c\x02\x1a\x01\xfe\xd4\x2d\xe3\xc5\xa0\xfd\x75\x5e\xaf\xcc\xb7\xca\x22\x66\x4b\xb2\x49\xa6\x19\x61\xb5\x92\xe2\x6e\xd1\x55\x31\xd9\x4e\xd5\xe4\x03\xfe\x40\x26\xe9\x94\x43\x73\x74\x3a\xc9\x88\x2f\x1a\xf8\x60\xa1\x9c\x11\x52\xb6\x70\xa3\x30\xad\x5d\xfa\xd2\x3a\xfe\x4b\xab\x49\x36\x49\xa7\xa8\xd7\x6b\x44\x13\x38\x6d\xdb\x49\x5d\xe2\x9b\x68\x2c\xb9\x8a\x08\x33\x52\xc5\xbb\x10\xa6\x88\x93\x29\xde\x90\x33\x1f\x2f\x55\x7e\x65\x31\x26\x5a\x2f\xbf\xd2\x3c\xd4\x7e\xd6\x55\x46\x16\x27\xc5\x23\xcd\xde\xd2\x2c\x87\x73\xad\x8f\x6a\x5d\x2d\xb4\x79\xd6\x6d\xb4\x63\x27\xe8\xae\xf1\x18\x10\xc8\xf0\x3c\xa3\x30\xbf\x60\x43\x1f\xe2\xf3\xc8\xce\x26\x46\x6f\xbe\x3b\x7e\x9a\x23\x6c\x94\x8d\xa1\x6c\x8a\xea\x4b\x43\xd1\x51\xd6\x8a\x84\x36\x23\x99\x0c\x73\xd1\x35\xd2\x19\x42\x38\xb1\xed\x16\xc6\xcc\x7a\xe0\x55\x4c\x66\x92\xa7\x11\x96\x7e\xb7\xa7\xf0\x28\xef\x52\x49\x0b\x19\x66\x08\x1f\xc1\xfc\x94\x70\x09\x0e\x1f\xbd\x62\x95\xe5\xe5\x27\x76\x28\x3b\x4e\x1f\xa1\x1a\x82\xb4\x1f\xcf\x57\x34\x7f\x9e\x45\xcc\xf9\xe6\x6b\xb7\xfc\xf7\xf1\x37\x48\x9a\x20\xc0\x8d\xe1\x22\xc9\xf8\xc3\x39\x2f\x2e\x2f\x47\x21\xea\x6d\xea\x94\x43\x1f\xf1\xe6\x2e\xf3\xca\xec\x75\xb6\x67\xf9\x73\x5a\x80\x19\x92\xde\x15\x54\x83\xee\xaa\x14\x45\x95\x06\x82\x4f\xa0\xe4\xe3\xb5\xac\x4a\xe1\xb6\x26\xa3\x70\x7d\xc1\x01\xa1\x60\xbd\x76\x5d\xb4\xb6\x6d\x47\xd4\x75\x89\x50\x33\xaa\xa7\x36\xfc\xd6\x53\x14\x2e\xc5\x62\x1c\xd1\xe9\x54\xaf\xde\x42\x5f\xbd\xb8\x78\x15\xa7\x71\xc9\x9c\xc5\x24\x9f\xa2\xbb\x3b\xf8\x2b\x03\xd7\xcf\x9b\xd2\xf1\x7c\x32\x6f\x4a\xc7\x1b\x90\x8e\xe7\x95\x48\x06\xd2\xb8\x29\x25\xfc\xb8\x4c\x33\x0e\x3a\xc9\x1a\xa5\x82\x5b\xab\x0f\x9e\x1b\x36\xa7\x5c\xec\xcb\x16\x83\x6d\x1a\xb1\x45\x9c\xb2\x68\x90\xe5\x90\x76\x4a\x0a\x9b\xe2\xc4\xf2\x2c\x74\xda\xb4\x24\x3d\xed\x04\xfb\x93\xf2\xde\xfc\xb1\xf2\x9e\xb0\xb7\x51\x4e\x38\x73\xbc\xd4\x00\xa4\x6e\x0f\x34\x02\xea\x2c\xf1\x59\x57\x12\xb4\xa6\x0c\xd2\x95\xa7\xbb\xc3\x87\xa7\x23\x05\x45\xc3\xfc\x49\x6f\x03\x3e\x6b\x8d\xab\x0b\x48\x0c\xde\x13\x01\x7f\x11\x27\x4c\xa4\x56\xae\xd8\xe3\x3a\xa7\x01\x64\x7f\x2c\x1d\x84\x20\x1a\x10\x88\xb8\x42\xf8\x40\xc8\x84\x89\xb8\x29\xaa\xe5\xe0\x3f\xe5\x9a\x54\x69\xcb\xda\xc9\x15\x6c\xbb\x6b\x78\x35\x49\x10\x77\xec\xf5\x28\x6a\x56\xf4\x9f\x1c\x89\x3c\xc0\xeb\x6f\xd6\xf9\x17\xba\xef\x04\x42\x30\xff\x16\x06\x68\x9a\x53\x17\x7f\x53\xcb\x9c\x21\x25\x22\x03\x86\xf7\xf9\xcd\xeb\x1f\xca\x72\xf3\x81\xfd\x63\xcb\x8a\xf2\x8a\x1f\xf8\x66\x11\x44\xa4\xbe\x9e\x97\xf1\x8e\x7d\x7e\x07\x60\xe1\xd2\xe6\x3c\xcf\x8a\x6c\x51\x42\xf3\x4f\x9f\x7e\xb2\x74\xdb\xb4\x90\x7a\x59\x0a\xd6\x61\x45\x49\x4b\xd6\x0e\x31\xfe\x15\x21\x54\x98\x8f\x7d\xe4\x15\x6c\xdb\x19\x8f\xc0\xa9\x94\x63\x4a\xb9\x2d\x6c\x5b\x7f\xba\xbb\x8b\xcd\x99\x80\x4b\xf4\x26\x4b\x0b\xc6\x89\x2d\x04\x9a\xf0\xb2\x0d\x4b\x1d\xeb\xfb\x97\x9f\x2c\x5c\x02\xf2\x53\xaf\x60\x69\xe4\x08\x82\x62\x52\x07\x29\x3b\xfd\x9c\xfe\x9e\x66\xfb\x54\x88\x6f\x0b\x60\xca\x82\x81\xe5\x56\x70\xee\x0a\x5b\x21\x2f\xdf\x9a\xd6\xfc\x66\x7a\xbe\x33\xbf\x32\xe5\x05\xec\xc6\x31\x79\xef\xcd\xb3\xcd\xf1\xe7\x82\xe5\xd7\xc0\x0b\xf0\xd5\xb0\x6a\x57\x15\x2b\x86\x54\xc5\xb5\x95\xaf\xf4\x60\x21\xb1\xf6\x84\xb0\x55\x5b\xfb\x1a\x2d\xf4\x08\x6f\xb1\xf6\x24\x86\x91\x12\xbe\x77\x20\x4a\xf9\x73\xbe\x14\xd5\x9d\xd0\xeb\xb8\x28\x9d\x4e\xcb\xde\x18\x55\x29\xe7\x5f\x30\xb6\x71\x9a\xf7\x3c\x38\x7e\x98\xba\x60\x7a\xd5\xe3\xdc\x4a\x4b\xfa\xf7\x38\x49\x34\x72\x81\x6b\x4a\x40\x28\x66\xca\xb5\x13\xc8\x06\xe7\x42\xd8\xdd\x9d\x93\x5e\x35\xf6\x48\xd0\x36\xb7\x3d\xf3\x45\x60\x4f\x13\xd8\x1d\xc7\xb1\x9e\x3d\x43\xe4\x53\x69\x59\x1b\x51\xc4\xf7\x7c\x0c\x89\xa0\xa9\x6d\x77\xbe\x07\xe7\x4f\x70\x18\xe8\xcb\x00\x28\xb2\xc7\xb4\xd3\x3c\x9e\xc9\xc1\xf3\xb7\xb3\x24\x9b\xff\xae\x3c\x2d\xeb\x12\xb0\xd8\x92\x7a\xb1\x33\xa2\xb4\x09\x60\xed\xd7\x38\x88\x84\x02\xb5\x4a\x84\x35\x28\x56\xd9\x36\x89\x06\x37\x6c\x30\xa7\x49\xc2\x22\xc1\x8c\xff\xc1\xf2\xac\xd6\x78\x15\xfc\xa4\x2b\xf7\xd9\x20\xcd\xd2\xe1\xdb\x9f\x5f\xbf\xd6\x5e\x79\x83\x9f\x72\x56\xb2\x94\x9f\x53\xfc\x14\xdb\xd3\x02\x5a\xf3\x33\xab\x24\x22\xd2\xb9\x61\xad\x2e\x8d\x55\x63\x23\xab\x4a\xa8\x2e\xa5\x55\x56\x1b\x33\x3f\x8b\x96\x41\xa9\x51\x41\x66\x68\x61\x5a\x0d\xf1\x01\x52\x1a\xf6\xb0\x84\xa9\x1b\x63\xf5\xda\xe8\x6c\x9e\xc4\x2c\x2d\x21\x3c\x83\xd9\xac\xab\xda\x0f\xf0\x0e\x61\x4a\xf4\x19\xd9\x76\x4c\x8c\x39\x99\x09\xc9\x5a\xc9\xee\x6a\xe4\x34\x92\x07\xc9\xe5\xf4\x4f\x4d\xdf\x57\x95\x60\xa1\xc3\xe3\x56\x23\x02\xe5\xfd\x2e\xb4\xb5\xa9\x7d\x33\x33\xb1\x62\xd2\x15\x77\x5e\xd7\xb4\x90\x9a\x89\x94\x4d\xb4\x4e\x26\x9a\x27\x49\x57\x4b\x75\x29\x0a\x75\x74\x3f\xc0\xa1\x1f\xa2\xee\x3e\x05\x97\x76\x36\x42\x61\x77\xaa\x79\xa3\xff\x96\xd9\xc3\x2f\x1d\x13\x6c\x26\x08\x36\x12\xcf\xa8\x58\x16\xc0\x0a\x28\xbe\xc1\x29\xf9\x9c\xeb\xc8\xa5\xed\x33\xfe\x2a\x26\x67\xa3\xa0\x24\x10\x23\x33\xae\x1c\xdf\xd2\x1e\x02\x91\x82\x94\x77\x31\xba\xbb\x4b\x2f\x89\xd2\xd5\x5e\x35\x58\xd0\x74\x47\x93\x38\x1a\x08\x19\x42\xe9\x5d\xe3\x74\x60\x4c\x8b\x1f\x3b\x29\x0a\xe8\x24\xe5\xc4\x24\x95\x72\xcf\xa0\x11\x53\x43\x17\x50\xad\x1b\x21\x77\xe9\xe9\x9f\xd2\xe9\xd5\x7f\xf7\x40\x02\xfe\x0f\xa4\xf6\x9c\xa4\xd3\xff\x86\xbe\x61\x72\x01\x9d\xf0\xbf\x53\x22\x3d\x2a\xfb\xf0\xda\x24\x9c\x8a\x31\xbe\x85\x9d\x19\xe8\x64\x47\xec\xcd\x40\xdf\xa7\xed\x80\x28\x1a\x7b\xdc\xa6\xc6\x02\x6b\xeb\x1a\x7c\xcf\xc9\x50\x0f\xd2\xb1\x56\x8f\xb0\xd0\xb8\xc2\xca\x63\x16\x01\x7b\x6f\x7c\x64\x70\xc3\x16\x59\x5e\xdd\x6e\x01\x0d\x05\x96\xc7\x1b\x7c\xca\x8f\xbc\x32\xdc\x30\x97\x2b\xb6\x06\xe5\xbb\x78\xe9\xa0\x01\xa4\x87\xf1\x06\x1f\x59\x7d\x33\xe6\xcd\xb3\xf5\x79\xc9\x8a\xb2\x38\xaf\x07\xe9\xad\xca\x75\x62\xb5\x5d\xcf\x75\x39\xa0\x35\x2f\x54\x1d\xae\xbd\x0e\xf9\x5d\x70\x6a\xd8\x73\x6b\x1d\xb6\xe3\xd0\x09\x25\x47\x37\xaf\xdf\xbc\xe4\x50\xbd\x5e\x95\xd2\x13\x0f\x05\xed\x98\x10\x60\x92\x02\xe6\x15\x22\x40\x62\xaf\x9d\x79\xd3\x03\xa8\x9c\xb6\x46\xf7\x21\xdb\xbf\xca\xf2\xcf\x3d\x21\x5d\x47\x2a\xb0\x97\x4c\x9c\x0b\x24\x8d\x5d\x10\x1a\x56\xb9\xfb\x5d\x76\x79\xe9\xab\x90\x9e\x95\xe4\x1b\x63\xa1\x1e\x4e\x2f\x4a\xc4\x48\xec\xfa\x15\xff\x9e\x5e\x96\x88\x92\x78\xe8\x57\x2a\x39\x46\x48\xac\xd0\x29\x0e\x29\x89\xab\xcb\xc4\xf6\xd4\x01\x27\xda\x87\x43\xd3\x69\x4d\x26\xf0\xad\xfd\x31\x40\x11\x82\x82\xb2\xe1\xf4\xd1\x8e\xbd\x60\x64\xd0\x68\x85\x0a\x3a\xf0\x2a\x32\xf9\x07\xae\xd3\x38\xe4\x6c\x19\x17\x25\xcb\xab\xf4\x7e\xe2\x83\xb7\x2c\x61\xeb\xa0\xc4\xbc\xef\x80\xe1\x45\x1a\xd0\xa6\x20\xd8\x95\x1b\xb0\x2b\x1e\x4a\xeb\x0b\xa8\x23\x92\x47\x7b\x18\x9a\xd7\x86\x1e\x14\xb3\x55\x71\x52\x4e\x43\x33\x1d\x20\xf3\xf8\xe0\x65\x96\x28\xcc\xbc\x45\x5a\x65\x33\x6c\xb4\x25\x13\xc0\xaa\x9f\x5e\xff\xfc\xfd\x8f\x6f\x3f\x92\xc9\xcf\x55\xae\x9e\xcf\xd5\xaf\xff\xaa\x7e\xfd\x56\xfd\xfa\xa1\xfa\xf5\xbd\xfa\x35\xc5\xef\xbd\xef\x7f\x89\xff\x00\xb7\x21\xf2\x8f\xaa\xc2\x7b\xef\xc5\xf5\xc7\x1f\x5e\xbe\x98\xbd\xfe\xf1\xed\x4b\x72\xd0\x9f\xf8\xbb\x77\x9f\x66\xbc\xa4\x7a\xab\x3f\xe3\xf7\x3d\xda\xfd\x5e\xb5\x3f\x7e\x2f\x43\xc4\x55\xb1\xe2\xf0\x7b\x15\x54\xb9\x0e\xaf\xcc\x57\x91\x2e\xd9\x67\x22\xc3\x28\xcb\xe7\x5f\xe5\xf3\xaf\xf2\xbb\xca\xe6\xf2\xa0\x3f\xf1\x77\x62\x66\x3f\x36\xb2\xd2\x90\x85\x7a\xa3\xfe\x42\x31\x7e\xef\xa5\x59\x5a\x55\xde\x31\x51\xb9\xb3\x74\xa6\xf5\xd1\xf5\x1a\xbf\x57\xa1\xbd\xea\x20\x5f\x7c\xf9\x44\x76\x4b\x72\xfb\x9a\x2d\x59\x1a\x05\xf5\x2a\x5e\x1f\x58\x11\xd4\x4b\xa9\x51\xd3\xa0\x5e\x42\x58\x31\x41\xe9\x82\x7a\x89\xbf\xcf\xe3\x28\xa8\x56\x17\x83\x4a\x40\x44\xb3\xc9\xf2\xe0\xbf\xf4\x08\x18\x2f\x6a\x9f\xde\x82\xdc\xca\x34\x4d\xb2\xa0\x8e\x95\x81\xbf\xa3\x79\xa1\x4a\x3f\xd4\x1f\xaf\x4c\x5b\xd4\xbb\x2a\x28\x07\x96\x5d\x29\x03\x74\x55\xa1\x8a\xf1\x81\x5f\x2a\x05\xad\x7a\x55\xc5\xe8\xc0\xaa\x51\xa1\xbf\x7e\xa5\x0f\x1b\x04\xb2\x9f\x68\xaa\xc1\x5c\x15\xa9\xb7\x22\x16\xbd\xf9\x9a\x97\xe1\xf7\x1e\xdf\x6d\x66\x63\x59\x22\xdf\x35\x9a\xaa\x22\xfc\xde\x63\x69\x64\x36\x14\x05\xe2\x4d\xa3\x99\x2c\xe1\x38\x24\xae\x6c\x5e\xc7\x29\xa3\xb9\x30\x7a\xdf\x75\x14\xd6\x35\x1b\x75\xd4\xdb\xfa\x86\xcd\xbc\x6e\x7b\xef\x7d\x9f\xd3\x74\x9b\xd0\x9c\x73\xa6\x3b\xfd\x09\xbf\xe7\x67\xc3\x0b\xb9\xe1\xc8\x4e\x7f\xe2\xdb\x2b\xc9\x68\x29\x76\x20\xdf\x62\xf5\x13\xa6\x6a\x1e\xe4\x3d\x66\x1e\x3b\x6c\xb2\xbc\x2c\x48\x55\x7a\x32\xc2\x57\x39\xd6\x6c\x93\x67\x73\x56\x14\x16\x17\x7b\x6f\x2d\xef\x9c\xcb\xd6\x2b\xb1\x74\xe7\x37\x34\x2f\xac\xe0\x6b\xdc\x51\x3c\x14\xe6\x51\x56\x30\xee\x7c\x0b\x0a\x12\x2b\x78\xd6\xf9\xb2\x32\x48\xb4\x82\xaf\x9a\x15\xe4\x30\xad\xe0\xaf\x3d\x6f\xf4\xd6\x7f\x81\x3a\x32\xcb\x9e\x70\x8d\xb4\x82\x6f\xf5\x42\xd5\x08\xe4\x09\x2b\xf0\x47\xfa\xcb\xe5\x2e\xfe\xc3\x0a\x7c\x5f\x2f\xd3\xd2\x5e\x0d\xd7\x90\xf7\x2a\xf0\xc7\x7a\x05\xc1\x27\x59\x81\xff\x4c\x2f\x95\xe6\x20\x56\xe0\x7f\xdd\x51\x3c\xcc\xd9\x82\xe5\x2c\x9d\x33\x2b\xf0\xbf\xd2\x2b\x88\xdb\x41\xde\xee\x1b\xbd\x78\x5b\xc6\x09\x2f\x84\x09\xc6\x0b\x2e\x55\x0f\x4b\x9a\x6f\xac\xc0\x87\xe9\xc9\xd4\xba\x1a\x2f\x57\x58\xc1\x78\x64\xbc\x3a\x30\x5e\xe6\xeb\x65\x73\x4e\x74\x86\x92\x77\x0a\xc6\x63\xfd\xdd\x32\x8f\x23\x2b\x18\x3f\xd3\xcb\x12\x20\x6d\x56\x30\xfe\x4a\x2f\xcd\x39\x55\x1a\x16\x92\x2c\x59\xc1\xf8\x6b\xac\xb0\x28\xf0\x4f\x53\xec\x7f\x1b\x4c\x9a\x7c\x80\xb5\x2d\xd8\xa0\x28\xf3\x78\x5e\x5a\x61\x95\xfb\x36\x56\xea\x60\x3e\xb7\x82\x9f\x8b\x42\x3d\xe8\x09\x55\x7a\xad\x28\xc1\xd6\x6c\xc6\x8a\x37\x59\xb4\x4d\x98\x85\x6f\xe1\x12\x34\x38\x1b\x9d\x94\x7a\xaa\x74\x5a\xc0\x43\x38\x6f\xc5\x30\xb6\xed\xd2\xab\x3b\xaa\x62\x0a\x87\x95\x46\xa7\x72\x58\x2b\x51\x43\xb9\x23\x07\x56\x33\x22\xa6\x28\xa7\xf2\x6e\xf4\xa9\x74\xaa\x4d\x59\x62\x76\x82\x7b\x57\xc3\x4f\x71\xc7\xf2\xa6\xe4\x2d\x58\x95\x2a\x29\xe5\x92\xa9\x84\x04\xc5\x77\xc7\x4f\x14\x1c\xb7\x1d\x4b\xa0\x86\x55\x05\xdb\xec\x48\xf9\x50\x4e\xd8\x14\xc7\x24\xaf\xd2\x1c\x50\x84\x53\x48\xc4\x97\x41\x16\x3e\x4e\x1b\x44\x4a\x04\xa1\xe7\x48\xaa\x67\xa1\xd0\xc0\xab\xde\xcc\x98\x51\xbc\x03\x3f\x9e\xfe\x6c\xbd\x2b\x3d\x2b\x6f\x2a\xb4\x31\x2b\x2d\x83\x6f\x66\x16\x09\xbd\x4e\x61\x16\x4a\x5d\x4e\x62\x96\xfe\x01\x7c\x3a\xf9\xf6\xdb\x6f\x71\x35\xbc\x9b\x2c\x3a\x1a\x69\x35\x55\xe2\x55\x40\x2f\x95\x8b\xf5\x74\xc2\x3a\xf0\x65\x16\xbc\x6e\xf0\x57\x9c\xa2\xe8\x41\xe3\x0e\xeb\xd2\x49\x39\xf5\x36\x34\x67\x69\xf9\x36\x8b\xcc\x04\xcd\x46\x25\x29\x67\x55\xa8\xae\x51\xea\xb8\x93\x52\x0b\x72\xdc\xa4\x08\xa7\x29\x1e\x8f\x1e\xd8\x60\x7f\x6a\x17\xc5\xad\x4b\x1a\x43\x9c\x9d\x4c\x4f\x06\xd2\x96\x99\x60\xce\xda\x22\x9e\xa5\xcb\xb0\x82\x4d\xb2\x4c\x98\x2b\xa7\xa9\x0e\x39\xec\xb6\x8e\x18\x20\x13\xc5\x56\xcf\x58\xf7\x91\x17\x2f\xf5\x92\xc6\xba\x46\xac\xa4\xf3\x55\x5b\x96\xec\x58\x5c\x7d\x9e\x7d\x12\x80\x5e\x87\x33\xff\x4c\x5b\x73\xc8\x64\xde\x8d\x01\x2a\x7a\x43\xa3\xb9\x88\x5b\xd8\x09\x64\x63\x12\xf5\xe4\xdb\x22\x9c\x3e\x41\x2e\x82\x1b\x93\xd7\xe0\xd2\x69\xc8\x24\xd1\x0a\x53\xc2\xea\x78\x1a\x62\x24\x2c\x9a\xd5\xb1\xff\xa9\xba\x48\x69\x24\x9a\x89\x49\x29\x63\x11\x68\x33\xc7\x46\xa8\x58\x88\x51\xd5\xcc\xe5\x58\x45\x6e\x8d\xb5\x89\x87\x79\x53\x31\x56\xa2\xab\x7c\x52\x4e\x9d\x1c\xc7\x98\xe1\x14\x05\x4c\x53\xf5\x71\x1a\x6b\x3e\x57\xf5\x4e\x27\xf0\x67\x91\xb3\xd3\x52\xe2\x66\xe4\xf6\x24\x73\xa4\x50\x3d\xee\x87\x8c\x9b\x41\x65\x2a\x8b\xb3\x3a\x0f\xca\x45\xee\x1d\xee\xee\xaa\xc7\xcb\xdc\x3b\xb8\xb9\xb7\xaf\x8b\x8e\x17\xb9\x77\xd4\x1e\x2f\x73\xef\xe8\xe6\x9e\x96\x1f\x43\x9b\x22\xde\x92\x6f\xc2\x55\x73\x9a\xe0\xb8\x27\xc8\x2c\x18\x7c\x6c\x89\x70\x74\x93\xaa\x64\x19\x7f\xeb\x5e\xf2\xfb\xbf\xc2\x48\x52\xc4\x45\x26\x63\xc6\xe8\xb0\xb1\x34\xab\x22\xf1\xda\x42\x40\x48\xa5\xd9\x48\x95\xa3\xb8\x1e\xaa\xd5\x31\xce\x78\x2e\x72\x7f\x3b\x73\x97\x58\x4a\xa9\x24\x25\x85\x7a\xb7\x0f\x5a\x5c\x57\xdd\x29\xc2\xed\x5e\xe7\x45\x01\x61\xf7\x60\xee\xd0\xb3\xe5\xae\x3c\x55\x8a\x70\xa4\x25\x53\x9e\x4b\xaf\xf3\x76\x2f\x70\x68\x58\xe8\x6a\x25\x8e\x0f\xce\x49\x2d\x3b\xaa\xad\x24\x98\xaf\x56\xf2\x44\x09\xfc\x6f\xc0\x11\xa7\x67\xb2\xca\x68\xa6\x37\x2d\xf4\x7a\x69\xa1\x70\xe1\x15\xf9\x9c\xac\x3c\xde\x06\x2f\xe4\x01\xb6\xc1\x0b\x75\x6a\x2d\x71\x64\x9c\x48\xca\xcc\x40\xc7\x8d\xd6\x00\x2a\x2b\x10\x0e\x18\xb3\x7d\x63\x34\xbc\x12\xdf\x79\x8e\xd1\x5f\xd5\x5e\x7a\x8b\xcf\x48\x9d\xdd\x67\x73\x3e\xae\x30\x06\x4e\xe5\x59\x8d\x0e\x3b\x32\x12\x10\xa1\x25\x27\x2d\xd7\xe5\x77\x59\x59\x66\x6b\x65\xca\x22\xf1\x7b\xb8\x1c\x6e\xc3\x6c\x32\x9b\x5e\x1d\x87\x84\xff\x0d\xf8\x3f\x64\x84\xf9\x1f\x97\x6c\xdd\x25\xde\x91\xa3\x98\xe6\xae\xfa\xf2\x11\x9a\x45\xda\xd9\xbf\x93\x59\xa8\x8d\xb3\x7f\x63\x16\x2a\x28\xaa\xd2\x32\x2e\x13\x66\x6c\x2c\xb0\x21\xa9\xea\x43\x68\x6e\xc2\x8c\x4c\xeb\x22\x4c\x77\x55\xe5\x06\x2c\x2b\x9e\xf7\x57\x5c\x79\x51\xbc\x23\x11\x6e\x6b\xb7\x9c\x08\x5b\x90\x69\xd8\xc2\xa9\x23\x7e\xa9\x08\x9a\xd8\xaa\x87\xf4\xdc\x78\x91\x20\xd4\xd3\x15\x44\x2e\xe6\xbc\x07\x74\x27\xe2\x18\xef\x58\xde\xd5\xe5\x9b\xd6\xcb\x87\xba\xdd\x96\x5a\xaf\xdb\xb2\xbf\x53\xed\x5d\x7f\x9f\x91\x4c\xb1\x0c\x7d\x46\x37\xc9\xf3\xbe\xb9\xbf\x68\xbe\xe3\x7d\xc6\x26\x0a\x77\x1c\x89\x82\x37\x8b\x04\xba\x1e\x48\xe9\x99\x21\x78\x44\x0a\x1e\x19\xec\xf2\x60\x84\x47\xef\xa6\xa9\x32\x05\xc1\x95\x20\xa7\xf0\x14\x74\x2e\xf6\x41\x8b\xd1\xde\xdd\xd5\xdf\x2b\xf2\x52\x3d\x19\xa7\x91\x11\xc3\x9d\x8f\xee\x86\x2d\xe3\xf4\x27\x5a\xae\x1c\x4e\xf3\xba\xb7\xd2\xce\x5d\x86\x07\xd0\x4f\x7c\xca\xea\x23\x07\x1f\x91\x1c\x90\x59\xea\x6e\x25\xd5\xe8\x68\x52\xed\xaf\xce\xa6\xf5\xee\x1b\x0f\xb7\x28\x04\x1b\xf6\x82\xc9\xc1\x29\x40\xc2\xcf\x2a\xfa\xe8\xa9\xc5\x47\x41\xd2\xe4\x16\x73\xd8\x64\x3f\x1e\xe6\x66\x39\xe7\xea\xff\x6b\x38\x57\x2e\xff\xb5\x05\xc0\xf4\xff\x58\x01\x30\x46\x66\x9e\x16\x80\xe8\x41\x08\xe6\x75\x28\xec\x63\x5d\x70\x0a\xf3\x47\xf2\xde\x07\xa6\x31\xdd\xf9\x23\x99\x6e\xc1\x02\xea\xc9\xa4\xf0\x3d\x7c\xb8\x11\xe9\x4a\xdd\xa3\x69\x45\x27\xf3\xc3\xa2\xc3\xfb\xd8\x50\x30\x38\xaa\xf7\x54\x15\xab\x86\x53\x01\xfe\xcb\xc2\xd6\x51\x9d\xc8\x94\x74\xd5\xac\xd8\x1c\x99\x4b\x81\xd7\x77\xc7\x4f\xfb\xaa\x7e\x8a\xe7\xbf\x8b\x14\x11\xbc\x62\x58\x42\xf6\xd6\x7c\xc7\x3e\x6e\xe8\x9c\xbd\x66\x8b\xd2\xa1\x90\x0b\xe3\x81\x41\x1d\xd4\xa0\xe2\x30\x36\xd9\x2e\x08\x1b\xad\x38\xbb\xab\xfe\x57\xc1\xbd\x93\xa9\x78\x36\xf8\xd4\xe3\xe6\x73\xb0\x10\x36\xe7\x23\x48\x8f\x13\xc3\x8c\xc6\x84\xb0\x3a\x50\x91\x88\xf4\xf9\x00\xe4\xc7\x5f\x0a\xfa\xf1\xa3\x61\x3f\x6e\x01\xff\x03\x87\x0b\x87\xbe\xa0\x78\xda\x58\x2f\xc7\x9c\xed\x67\x9a\x29\x79\xb9\xcf\x06\xc7\x21\x3d\xb4\x3c\x05\x68\x29\x3c\x85\xcb\x78\xcd\xbc\x81\xf3\x29\x3f\xc2\x45\x69\x06\x2e\x7a\x96\xab\x75\x0a\xde\x49\x26\xba\xf6\x0a\x8e\x4a\x6b\x55\x36\xae\xfc\xee\x51\xbc\x84\xd4\x10\x13\x69\x9f\x98\xc8\xe7\x2b\x0d\xa9\x14\x15\x40\x58\x16\x1c\xeb\x82\x07\xa9\x84\x31\x91\x2f\x11\x1e\xf5\x76\xc6\x5e\x36\xef\x39\x15\x08\x98\x76\x71\x0a\x96\xc2\x90\xf8\xc7\x29\x91\xeb\x7d\x7d\xaa\x6a\xd1\xbe\x5a\x43\xef\xeb\x53\x6d\xec\xa7\x8b\x6c\x90\xfc\xed\xc1\x4d\x77\x77\xf7\x40\x9d\xe3\x63\xea\x54\x78\xad\xb2\x52\x36\xd9\x0e\xbc\xed\x94\x72\x23\x92\x2b\xbb\x81\x39\xc9\x95\xbd\x00\xde\x74\x11\x56\xa5\x14\x0b\x34\xa5\x98\x12\xd4\x82\xae\x01\x76\xec\xfd\x52\x48\x6c\x58\x88\x37\xf7\x36\x92\x5b\x50\xb6\x38\x9d\xf0\x92\xdc\x1e\x82\x8d\x08\x4b\x7f\xe4\x3f\x8e\xfc\xc7\x18\x7e\x8d\x39\xe6\x2f\x5a\x57\xb6\x62\x61\xee\x15\x3a\x71\x4e\x96\x13\xde\x01\x21\xf4\x8a\xff\x0d\xd8\x34\x54\xf9\xbc\x9c\x58\x70\xda\x38\x17\xa7\x73\xf6\x80\xfe\x50\x22\x48\xa6\x09\x7b\xb5\x54\x7a\x88\x0b\xa1\xaf\x1e\xb4\x8b\x86\x96\xcb\x5c\x87\x5e\x59\xdd\xef\x68\x60\x59\x08\x67\x5e\x9c\xa6\x2c\xff\xe1\xd3\x9b\xd7\xa4\x6c\x70\xa2\x19\xc2\xf1\x29\x5c\x49\xc6\x52\x8a\x4a\xb9\xd2\x87\xe0\x9d\xa6\x49\x30\x22\xc8\xe0\x63\x97\x01\x81\x1e\xfc\x5a\x16\x75\xac\x15\xc3\x25\x3a\x9d\x1e\x81\xe6\x70\xe0\xc5\x0b\x67\xe6\x1d\x21\xf6\x8d\x6d\xab\x5f\x8d\x8c\x4c\x07\x92\x6b\x91\xe7\xd6\x64\x72\x94\xab\x2c\x96\x78\x1a\x56\xed\xba\x12\x4b\x9b\x0e\x21\x00\x3b\x74\x5b\x90\x9d\x77\x90\x4c\x91\x75\xf4\x2d\x4c\xc9\x7a\x32\x9a\x86\x3e\xaf\xc3\x81\x6c\xdb\x0e\xd4\x71\x77\xde\x1e\x0f\x7d\xcc\xab\x8d\x45\x35\x7f\xaa\x94\xf2\xb4\x53\xfb\x10\x26\x64\xe7\x1d\xdd\xd2\xdb\x64\xc5\xd3\x9d\xb7\xc2\x19\x59\x38\xf2\xcb\x7c\xd6\x78\x4c\xc8\xe1\x8a\x05\xb5\x85\x60\x4e\x92\x61\x7a\x3e\x0e\x73\x08\xa7\x96\x93\x11\xc2\xb9\x9b\xba\xcf\x2e\xe7\x57\x59\x25\xd4\xf1\x23\x8e\x58\x23\x2b\xc8\x34\x11\x33\x17\x1b\x47\x78\x30\xf3\xb1\x5c\x39\x99\x2e\xfb\xee\xbc\xc3\x90\xb6\xb6\x0f\x52\x65\xd5\x49\x25\x37\x60\xd5\x35\x3b\x94\xd7\x49\xbc\x4c\x89\x95\xcb\x63\x5c\x87\x4c\xf3\x13\x1c\x48\xee\xe3\xbb\xe4\xcd\x00\x71\x75\xb9\xb8\x63\x94\xa2\x83\x6d\x0b\xa3\xab\x03\x41\x08\x55\x19\x3a\x49\x36\xf9\x86\x18\xe7\xc5\x64\x34\xc5\x7b\xf2\x48\x1a\x04\x6c\x12\x18\xe7\xfe\x98\x96\xce\x4d\x0d\x63\xec\x8f\x90\xbb\xbf\x9c\x0f\xf7\xb6\xad\x97\x93\xbe\xca\xc3\xfd\xf9\x18\x86\x2e\x52\x96\x5d\x37\xb6\x82\xda\x03\xac\xb8\x2e\x21\xa4\xa1\xa4\xd1\xef\x48\xee\x95\xd9\x4f\x2c\x9f\xb3\xb4\xfc\x0c\x79\x46\x9d\x11\x0a\x9d\x77\x97\xfe\xdd\xdd\xbb\x8b\x2a\x9a\xd2\x3b\x88\x93\xf9\x8e\x23\xc9\x35\x61\x0e\x07\xff\xbb\xa7\x3b\x6f\x2f\x25\x28\x59\x26\x6e\x2d\x6a\x29\xb2\x17\x0a\x71\xca\x84\x2c\x09\x10\xc0\x2b\x4d\x5c\xbc\xaf\x8d\xc6\x85\xe2\x55\x43\x22\x94\x22\xdc\x35\xa6\xce\xce\x3b\x22\xd5\x69\x5d\xe4\xee\xbc\x15\x14\xeb\xc2\xda\xaa\x16\xd6\xc6\x44\xdf\xf1\xb6\xed\xfc\x89\xb9\x8c\xff\xcc\x64\xc6\xfd\xb3\xa1\x8e\x44\x74\xd4\x9e\x56\xf3\xdd\x03\xf3\x03\x36\xf5\x61\x1e\x40\x12\xc7\x43\x29\x42\xa7\x71\x1c\x79\x41\x8e\x70\xd2\x85\xaa\xf8\x0b\x29\x5e\x45\x94\xf6\x58\x10\xa9\x16\x79\x3a\x68\x1b\x53\xdb\xb2\x22\xf4\x87\xb6\x9b\xb3\x0d\x49\xdc\x17\x9d\x5b\x5e\x92\xd5\x62\xf8\xa2\xbd\xa5\xcf\xc7\x21\x73\x3b\xca\x2f\x23\xf0\x0a\x88\xba\xda\xdc\x43\x95\x30\x03\x8a\xc9\xc8\xe8\x11\x74\x06\xa8\x15\x33\xa9\x92\xa0\x3d\x1d\x1f\xed\xa5\x3d\x87\x36\xed\x39\x7d\x39\x7a\x1e\xfe\x04\x76\x1e\x9a\xc8\x29\xa2\x13\xfe\x19\xf2\xf2\xab\x24\x2f\x58\x27\x30\x82\xac\xf8\x08\xbf\x24\x02\x8b\x39\x59\x59\x49\xb2\xa2\xca\x78\x49\x58\x6d\x0a\x41\x6a\xf0\x4b\x6d\x2f\xb0\x7a\x2f\xbc\xec\xdf\x02\xa7\x95\xae\x8f\xd1\x54\x2b\x79\xef\x45\x61\xcf\x4d\xe1\xf8\xff\x9d\x9b\x42\xd0\xcb\xce\xa2\x78\x27\x32\x29\xe8\x92\x4a\xb3\xf4\xd8\x5d\x3a\x6e\x14\x3f\xfa\xb2\x51\x33\xa4\xfa\xf2\xcb\xc6\x0e\xbd\xc7\x43\x97\x8c\x92\xb9\x69\x6b\x33\x1e\xc5\xe5\xb2\x7b\x2e\xcb\x99\xbe\x13\x4b\xef\x20\x36\x19\xd3\x68\x4a\xe9\x1d\xcd\x42\xe9\x08\xe1\xed\xcd\x62\xa9\x36\x2f\xbd\x95\x2c\x37\xa1\xa9\x0b\x7f\xb3\xee\xbb\xd1\x49\x63\x59\x5b\x2b\xda\x5a\xcc\xf6\x3a\x4e\x1f\xb0\x4a\x08\xa9\x6d\x3b\x8f\x16\x90\xa5\x35\xe5\xbf\x02\xd3\x04\x93\xd9\x4c\xb0\x83\xab\xbb\xca\x07\x56\xf6\x9e\x25\xcd\xf5\x25\xf5\x41\x5a\x1a\x6d\x0e\x56\xc0\xd4\xea\xe6\xda\xea\x32\xb5\xba\xb9\xb1\xba\x4c\xad\x6e\xde\x70\x6e\x51\xab\x9b\x37\x2f\x00\x4b\x9d\xde\x1d\x0d\xce\x76\x5c\x9f\x41\x0f\xc9\x65\xd9\x3d\xf3\xca\x1a\x23\x5c\x99\xe7\x46\x35\xc2\x7d\x83\xcb\x85\x59\xae\xce\xc7\x43\xe6\x29\x36\xb0\x71\x00\xf1\xf2\x21\xd4\x51\x6f\x3b\xc4\x42\x21\xe2\xe5\x70\x5b\x3d\xb4\x5c\x47\x40\x56\x9c\x7a\x81\x3c\xd8\x64\xb0\xc1\x47\xed\xca\x42\xfb\x48\x8c\x0b\x4d\x64\x4c\x71\x66\x1c\x72\x05\xc2\x79\xf3\xd4\xcb\xcd\xdd\xd5\xa1\xee\x6c\xa9\x5c\x66\x75\xde\x03\xed\x2a\xbe\xf4\xc0\x40\x8b\xa3\x66\x43\x23\xea\x58\x80\xf7\x95\xba\x91\x98\x4a\xb3\x4f\xd9\xa6\xa3\xb6\xd2\x31\x2a\xc3\x13\x6d\xe7\x38\xca\xfb\xae\x2e\xbc\xf7\x16\xd9\xe8\x6f\xf8\xd7\x2f\x41\xa2\xbe\xe5\x1b\xd4\x26\x70\x7c\x66\x86\xa0\xde\x35\xf3\xd6\x78\x1b\xab\x40\x8d\x82\x46\xe5\xa6\x32\xd7\xb1\x04\xc9\x50\x00\x2d\x48\xa7\xca\xd4\x6c\x01\x4b\xd7\x00\xaa\x41\x79\x9c\x02\xb5\xe8\xd1\xbd\x60\x35\xbb\xfc\xb2\xcd\xf9\x20\x5c\xe5\x0c\xfb\x01\xab\x40\xd0\x1e\xf3\xc3\xa0\xd5\x6a\xb7\x61\x7b\x34\x60\x9b\x90\x0e\xf5\xfa\x48\xc2\x4f\xa7\xd1\xb9\xc3\x70\x82\x7d\xdc\x33\x1f\xd9\x2b\xee\xfe\x54\xd7\x20\x8f\xf7\x0e\x72\x2c\x9b\xda\x76\x53\x27\xae\x82\xa5\xb4\xf5\xd2\xd5\xb0\xc7\x8d\x71\xaf\xf0\xb8\x77\xdc\xe3\xce\x81\x8f\xef\x1d\xf9\x58\x1f\xfa\x9f\xb3\xed\x69\xee\x7a\xe5\xea\xab\x6d\xa1\x39\xff\x62\xce\x52\x11\xb6\xf5\xbe\xdd\xd7\x46\x12\xd5\x9d\x8e\x37\x8f\xe8\xaf\xda\x77\xad\x33\x5a\x75\x78\xec\xe9\xf0\x11\x9d\x1f\x1b\x9d\x8f\x3b\x7a\x1f\xff\x13\xdd\x57\x6b\xf6\xb0\x95\x16\xba\xfd\xf2\x6b\xd4\xd9\xe3\xef\x51\x9f\xfd\xcb\xf9\xfa\x47\x33\xe0\xdf\xe7\x71\x04\x11\x23\xbf\x98\xfb\x7e\xc4\x3d\x62\xfc\xbf\xe7\x5e\x42\x65\xd5\xd3\x8e\xe7\xa4\x7d\x3d\xb0\x22\x95\xdb\x1c\x5c\x15\x74\x2a\x8b\x45\xbe\xef\x6e\x6d\x06\x07\x9d\x52\xf5\x2a\xde\x3b\x22\x13\xeb\x28\xb4\x2d\x53\x2c\xe3\xfa\x4c\xa6\x10\xd7\x07\x2f\xf8\x3f\x70\xf3\x23\xc2\xa1\x44\x7a\x38\x94\xe5\x24\x9f\x92\xfb\xbf\x14\x4d\xf2\x29\xc2\xbc\xa2\x6d\x3b\xf3\xbe\xfa\xcb\x3c\x8e\x34\x69\x5c\x34\xda\x3c\x54\x5b\xca\xe1\xa2\xf6\xec\xa1\xda\x3f\x81\xe7\x50\xaa\xea\x43\xe4\x96\x19\x8c\x8b\xff\xab\x34\xdc\x64\x8c\xc2\x8c\xac\xa4\xfe\x1a\x27\xca\x04\x24\xeb\x53\xec\x80\x87\xed\x8c\xd7\xae\x32\xc4\x83\x56\x36\x94\x73\xae\x7a\x58\xc0\x73\xe2\x15\x4c\x44\xbf\xa0\xc5\xaa\xf1\xe8\xcc\x60\x64\x89\xa1\xbc\xe0\x30\xc3\x89\xa6\x99\xe0\x60\xc1\x31\x61\xce\x96\x4b\xfa\x29\xa1\xce\xb6\x52\x6e\x6f\xbd\x15\x6f\xaf\xeb\xcb\x12\xa5\x1a\xe0\xd2\x85\xec\x88\x3f\xb9\x5b\x6f\x2f\x4a\x2a\x2d\x5f\xa2\x25\x84\x3d\x9d\x8c\xe7\xd3\xc3\x28\x05\x0a\x32\x0e\xba\x83\x09\x3a\x79\xc9\xf1\xa8\xa5\x01\x95\xca\x82\xcc\x6c\x7b\x56\x2f\x48\xb8\x78\x08\x6c\x4d\x98\x3d\x02\xc5\xe0\x4b\x3a\x58\x1f\x81\x68\x52\x17\xd7\x85\x08\x35\x16\x40\x2e\x7a\x58\x9c\x6a\x4d\xf6\xf5\x32\x7d\xc1\x02\xe1\xad\x77\xe4\xcf\xba\xbe\x26\xd1\x54\x96\x08\x3f\x04\x97\xc9\xd4\x5c\xc3\x07\x8f\x87\xc7\x1e\x05\x5f\x3d\xde\xdb\x42\xbe\x86\xe0\x11\x77\x77\x4a\x2e\xbf\x20\x2a\xdf\xf9\x93\x8b\x28\xde\x0d\x80\xb3\xd4\xb8\x4a\x70\x02\x19\x72\x48\x58\x03\xe0\x66\x89\x25\x8c\xe8\x86\xe2\xda\x65\x08\x76\x55\xc1\xe0\x89\xcb\xdc\x27\xa1\x75\x79\x71\x1e\xc5\xbb\xcb\x27\xa1\x41\x49\x71\x42\x46\x78\x45\x46\x90\x9d\x14\x22\x67\x88\x94\xa1\x55\x68\x59\xc8\x19\x9a\xb8\xa4\x9c\xc4\xff\xae\xca\xc0\x26\xd7\x29\xf4\x60\x54\xf4\xdc\x49\x86\x25\x44\xd8\x42\x97\xbe\x20\x9b\xa2\x27\xa3\xa3\xed\x24\x9e\xf2\xae\xa6\xe7\x34\x5c\x91\xad\x7c\x75\xaa\x82\x81\x15\xc4\xc7\xf7\x36\x4b\xb4\x66\xae\x2f\x23\xc0\xc9\x20\x57\xc2\x9b\xbe\x00\x37\xfa\xfa\xfb\xbc\x07\x32\x46\x39\xd9\x4e\xe2\x7f\x57\x4d\xa7\x38\x23\xf5\x37\xae\xb6\x13\x27\x76\x7d\x54\xbf\x0e\x46\x38\x72\xc9\x7d\x70\x8f\x68\xb1\xaa\xe0\xbe\xa6\xf9\x32\x4e\x87\x20\xe9\x72\x80\x67\xae\xc5\xd6\xe1\x60\x43\xa3\x28\x4e\x97\x43\x2e\xf9\x06\x03\xcb\xcd\xdd\x27\x6c\xad\xad\x84\x0a\x35\xfc\xcf\xb8\xd7\xfc\xcf\xf2\xaf\xd1\x33\x79\x49\x4e\x4b\xc0\xb3\xa9\x0e\x8a\x8b\xd9\x92\xa5\x2c\x07\xbb\x77\x78\x77\xe6\x9f\xc2\xec\x71\xac\x8f\x70\xfd\xac\x19\x9f\xec\x21\xc6\x47\x26\x65\x30\x35\x34\x42\x65\xfe\x42\x57\x48\xd0\x2a\xb8\x1c\xbd\x62\xa4\x15\xc1\x89\xde\xdd\x71\xb0\x15\x25\x4d\xe7\xfc\x59\x0c\xf0\xaa\xc3\x59\xe8\xbb\xe3\x8f\x91\x43\x51\x40\x03\xe7\x01\x0d\x25\x66\x9d\x22\xa5\xf0\x00\xc3\xa5\x27\x4c\xbe\xe3\x9d\x21\xac\x30\xd4\x0b\x45\x15\x3d\x4c\x07\xbb\xcc\xad\x97\xa5\x6c\xc6\xd6\x33\x19\x72\xc5\x1f\xe1\x5b\xe1\x4c\x16\x48\x1f\x7c\xfe\x1b\x47\x4c\x2f\x54\x4f\x58\x06\x1d\x08\xf4\x08\x04\x8f\xd3\xd9\x16\x5f\xa0\xb3\x2d\x36\x34\xb5\x50\x28\xc2\x3e\xa8\x00\x45\x8e\x05\xbb\xd0\xc2\x72\x1b\x06\x83\x51\xb5\xf5\x82\xc1\x08\xfe\xf3\xf9\x76\x14\xd4\x91\xbf\x06\x5b\x2c\x13\x60\xa1\xb2\xa4\xd2\x9c\xae\xaa\x28\x06\x4d\xdf\x11\x7a\xc2\x49\x67\xb0\x02\x2f\x67\x9b\x84\xce\x99\x73\x6e\x9f\x2f\xb1\x65\xd3\xf5\x26\xb4\x50\x5d\x6a\x41\xe9\x3f\xb6\x59\x69\x14\x5f\x40\x71\x62\x16\x5e\x42\xe1\x92\x17\x9a\x98\x2f\x40\xde\x29\x63\x8a\x57\x2c\xfa\x0c\xc8\xac\x9e\x44\x46\x5f\x08\x7d\xab\x8a\x3e\x64\x7b\x9c\x9a\x2e\x19\x15\xde\x0b\xdc\x92\x31\x48\xd9\x0e\x42\x90\x92\x54\x0f\x94\xe1\x34\x51\x48\xaa\x53\x64\xc4\x4f\x22\x32\x7e\x8b\x1e\x16\x59\x92\x64\x7b\xd1\x45\xc5\xfc\x75\xdb\x6f\xc8\xdc\x7d\x7a\xbf\xa6\x0b\x5c\xc7\x78\xef\x35\x35\xc4\x2b\x42\xb9\xe0\x78\x78\x9a\x7b\x7b\xf7\x6b\x7e\xca\xc1\xf3\xf1\x69\xee\xad\x86\x5f\x8f\xc2\x95\x5b\xb8\xfe\x65\xee\xed\x6d\xdb\x59\x91\xd5\xd0\x1f\x8d\x86\xc5\xd0\x81\xf4\xe3\x5c\x5c\xad\xbf\xd7\xb5\xcd\x9a\xa3\x6d\x6f\x2d\x5d\x87\x9a\xb8\x2b\x2d\xee\x51\xbb\x52\x99\x6d\xc8\x56\x18\x08\x89\x63\x2d\xf3\xd4\xe6\x15\x04\x8d\x4b\xbe\x4e\x2d\xf9\x30\x4c\x3b\xf6\x2d\x8e\x55\xe0\x10\xed\x03\xb5\xe0\x1c\xf5\x7d\xbd\x5a\xba\x06\xbd\x54\x3b\xdc\x40\x37\x8b\x26\x7b\x7a\x2c\x2c\xb8\xaa\xbd\x07\x85\xaa\xd4\xc0\x0f\x62\x8a\xbc\x7d\x6d\x83\x34\xec\x20\x4d\x4c\x6e\xd6\x07\x00\x24\x13\xf6\xcb\x3f\x0c\x0b\xd3\x95\x7b\x80\x43\x1b\x53\xef\xd3\xe8\x18\xa4\x0f\x02\x13\xeb\xcd\x24\xf5\x6b\x9d\xc2\x9d\x04\x99\x73\xc5\x5f\x86\x63\x4d\x05\xb5\xe6\x4d\x45\xef\xdd\x3f\xed\x99\x1b\x0a\xfe\x83\xcb\xbc\xfd\x90\x0e\xfd\x07\x91\x54\x5d\x88\x9c\x5a\x98\xd2\xa9\x4a\x69\x1e\xf0\xbc\x55\x7b\xdd\x9a\xf7\x3c\x29\x2e\x94\xc6\xef\x56\xce\x34\x28\xf1\x21\x60\x58\x04\x23\x0a\x26\xd3\x13\xde\x92\xdb\x13\x8e\xc4\xb1\xad\x8c\x26\x39\xd1\x89\x2a\x36\x66\x4e\xfc\x70\x5e\x0b\xe4\x5a\xee\x20\x68\xd4\x91\xec\xd4\x89\x26\x73\x2e\x8d\x9b\xcc\x80\x10\x29\x34\xf1\x98\xd7\x59\x90\x5b\xce\x06\xf2\xe1\x07\xb1\xb3\xc4\x1b\xe1\xca\x00\x22\x0a\x1f\x4d\xc0\xab\x89\x9f\x50\x27\x91\x7d\xc7\x05\x04\x4f\x4a\x58\xb0\x11\xe1\xad\x12\x86\x05\xb3\x2e\x7b\x00\xeb\x37\x18\x8d\x8a\x82\x8a\xb7\x13\xde\x76\x4a\x16\x27\xdd\x50\x82\xa9\x58\xb9\x65\x77\x56\x3a\x2e\x8c\xed\xc8\x4c\x66\xac\xad\x42\x83\x80\x7b\xf0\x01\xc0\xbe\x53\x2c\x1c\xc3\x33\x1c\x41\x8a\x22\x5c\x60\x2d\xd3\xff\x91\x4c\x20\x01\xbe\x66\xcc\x36\x27\xa3\x70\x7e\x71\x00\x68\x1e\x27\xf3\x69\xdf\xd7\x8f\x96\xeb\xcc\xaf\x7c\x77\x0e\x39\xf1\x64\x86\xcc\x0e\x1e\xeb\xe3\x2a\xdb\xff\xc6\xf2\x4c\xe4\xd1\xb7\x10\xbe\x11\xb5\x7e\x50\xb9\xd4\x55\xe4\x41\x18\x94\xf8\x3a\x6d\x2d\xe9\x9e\x50\x0e\xee\x05\xd9\x4e\xf6\xc2\x8d\x44\x04\x0f\x3e\x92\xbd\x77\xdc\xd1\x04\xec\xcd\xc4\x4f\xdb\x3e\x5b\x2b\xcb\xa4\x7d\xe5\xa9\x81\x16\x5e\xb5\x32\xe4\xcc\xaf\x83\x6a\xde\x83\x2c\xe2\x4b\x08\x5f\x93\xe3\x64\x03\x3a\x8d\xa1\x3f\xc5\xef\xc8\x75\x1b\xe4\xf8\x05\x79\xa7\x80\x2d\x47\x74\x8d\x45\x7b\x80\x79\x54\xa5\xe8\x92\x9d\xa2\x30\x57\xb6\x9b\x0b\x7c\x7b\x04\x14\x7a\x71\x42\xb2\x0d\x21\x37\xb6\xed\xf0\x21\x57\x60\x62\x90\x58\xa6\xca\x61\xe2\x94\x6d\x9a\xac\x8d\xe7\xee\x2e\x53\xec\x79\x9d\xc2\x4c\x0d\x70\x05\x44\xad\xf9\xfa\x21\x67\x81\x33\xc0\x49\x63\xdf\xac\xb2\xbd\xd8\x99\xef\xd2\x6a\x9c\x96\x4a\x7a\x60\x89\x5b\x15\x8a\x1b\x66\xfa\x12\x2d\xd8\x86\x02\x91\x88\x53\x26\x13\x67\x54\xf1\x38\x4b\xef\x20\x02\x60\x57\x27\x11\xeb\x3a\x80\xea\xef\x50\x3d\x14\xb2\x8a\xbb\x26\xf7\x98\x16\x7e\xad\xe2\x50\xc4\xab\x49\x3a\x0d\xf3\x1a\x2b\x6c\xdb\xb1\xf8\xa1\x07\x37\xe4\x2e\x89\xaf\xac\x8b\x9b\xfc\xfc\xd2\x0a\xac\x81\x85\x30\x75\x89\x75\xc1\x59\x54\x29\x16\x3e\x59\x64\x69\x39\xdc\x0b\xaf\xc6\xc1\x4d\x96\x44\xe1\x40\xca\xe4\x96\x9b\x8b\x9d\xee\x5a\xe1\x93\x4b\xfe\xa4\x08\x89\x6b\xc1\xcb\x8a\x68\xb8\xd6\xc5\x39\xef\xf3\xd2\xaa\x72\x39\xd0\x13\x67\xee\x0e\xe2\x6d\xf0\x27\x67\x05\xf6\x37\xd5\xc4\xd0\x6d\x2c\xa6\xc4\x27\x74\x69\xa1\xb0\x9a\x8b\xe5\x42\x3d\x0d\xc7\xae\x9e\x28\x91\x78\x55\x2d\xe8\x13\xbe\xc3\x5d\xeb\x72\x70\x71\x73\x69\x80\xa0\x77\xbe\xed\x09\x5e\x9c\xdf\x5c\x06\xf6\xbf\xf9\xdf\x8c\x42\x5e\xe1\x68\xce\xfe\x54\xcf\x5e\x53\xc0\x64\x5f\x6a\x78\xf3\xf5\x17\x68\x65\x6a\xb6\xde\x14\xa0\xaf\xca\xe0\x56\x7e\x2a\x28\x4f\xff\xbf\x12\xde\xcd\x41\xb7\x83\xb2\x20\x5c\x90\xd8\xc9\x20\x45\x1e\x54\xd5\x83\xa4\x70\x76\x3c\x76\x12\x84\xb7\x2d\x1e\x61\x45\x8b\x4f\xd9\x76\xbe\x82\x28\x4f\x0b\x3a\x67\x33\x62\x55\x91\xbb\xeb\xa4\x2a\x50\x07\xbc\x1f\x95\x7c\xfb\x26\xbb\x89\x13\xf6\x82\xed\x62\xde\xe6\x7c\x0d\x8f\x77\x34\x8d\xf2\x2c\x8e\xce\x97\xb1\x48\x68\x96\xd2\x5d\xbc\xa4\x65\x06\x36\x02\xbf\xb0\xbc\x88\xb3\x54\x89\xc8\xea\x8b\xcf\x41\xd4\x8c\x84\xa2\x61\xfb\x38\x45\x83\x11\x08\xaa\xd6\x37\x6c\x1f\x77\xd1\x22\x62\xdb\x49\x60\x56\xc1\x40\x2b\x2a\x36\x13\xd4\xd3\xf8\x06\x67\xa9\x85\xdb\x17\x8c\xb6\x06\x97\x83\xb0\x61\x35\xa5\xdf\x91\xce\x4c\xe9\x5c\xc4\xd5\xfd\x58\xd2\x32\x9e\xbf\xa6\x47\x96\xcf\x3a\x04\x75\x51\x49\x0b\xba\x25\x6a\x9e\xcc\xc9\xf5\xb1\x7c\x37\x4b\x71\xa6\xea\x1a\x9d\x45\x47\x19\x67\x3d\x7f\xcb\xb2\xb5\x70\x4b\xd5\xdf\x80\x2a\xad\xf9\xca\xfc\x78\x0d\x28\xd2\x1d\x67\x5d\x87\xae\x76\x38\xf0\x3a\x66\x4f\x05\x2b\xa5\xd3\x7c\x77\x87\x66\x4f\x22\x06\xea\xa4\x9c\x12\x66\x76\xd3\x5c\x93\x76\x74\x75\xa8\xf0\x1c\xc0\xc0\xea\xd8\xb2\xa2\xb8\x9e\x6c\xfd\x26\x4e\x63\x3d\xb4\x5a\x55\xae\xe3\x08\x4d\xe3\x35\x47\x5c\xde\x5e\xba\xec\x1b\x51\x2c\xaf\xe5\xfb\xc1\x1f\xbc\x02\xa4\x73\x81\x48\x41\x03\x15\x29\x08\x9c\xb4\x44\x52\xaf\xf5\x86\x96\xfc\x38\x08\x07\x51\x5c\xd0\x9b\x24\x4e\x97\x03\xa3\x7f\x4f\x99\x25\x54\xd0\x30\xa2\x67\x3b\xb7\x46\xed\xe0\xcc\x3f\xe1\xb3\x2a\xa9\x44\xc7\x56\x1b\x49\x9f\xe3\x28\xfa\x94\xc9\x48\xcf\x8d\xb5\xd1\x5e\xf5\x84\x9e\x54\x62\x93\x0c\xff\x5b\xaf\xb8\x2c\x0f\xcb\xb6\x40\x55\x21\x68\x53\x11\x64\xa2\x6a\xe7\xdb\x06\xd2\x76\xd6\x69\xa2\x6f\x63\x52\x42\x9d\xf4\x2a\xcf\xd6\x8f\x9b\x59\x58\xb6\xe3\xd7\x18\x53\x68\xbd\x5d\xdc\xfb\xb6\x63\x0a\xad\x3a\xad\x29\xe0\x06\xb4\xdb\x3b\xd2\x20\x3a\x6d\x89\xf9\x61\xca\xd6\x65\xec\xd3\x6a\x9a\xeb\xcd\x94\x91\x8e\xfb\x55\x0b\xc4\x4d\x2a\xd7\xda\x8e\x02\x75\xeb\x38\xb6\x33\xa7\x52\x58\xc8\xe8\xce\x6a\xbf\x71\xe2\xa9\x77\xe5\xa0\xce\xaf\xb5\xc8\xe5\xe3\x3e\x79\x26\xcf\x32\x15\xc3\x1d\xe0\x52\x59\x46\x80\x36\xb0\x8b\x38\xf0\x41\xb5\xbe\xd8\x1a\x59\xeb\x8b\x7d\xb8\x76\xff\xe2\x70\x2e\xa3\x44\xdd\xdb\xf8\xca\x44\x0c\x79\x42\x55\xcf\x9a\xed\xa8\x8c\x50\x6b\x6c\xf7\xa0\xe7\x3c\x6b\x24\x38\x55\xbd\x55\xd1\xd4\xcd\x1d\x54\x1b\xee\xe9\x34\x20\x2c\x44\xbe\x9b\x6c\xab\xe5\xe2\x40\xb7\x4c\x85\x15\x1f\x61\x56\xc5\x56\x3f\x61\xbf\xe2\xb0\xcb\x16\x5e\x73\x6c\xe8\xf3\x3a\x15\x76\xa9\x02\x9a\x29\x89\xa5\x87\xa3\xb4\x46\x80\xe8\xfc\x1f\x68\x19\x67\x0e\x43\x61\xa9\xa9\x51\xa8\xb2\x2b\x2d\x75\x45\x0c\x55\x26\xa8\xa5\x72\x31\xf2\xf6\x4f\x53\x5c\x2a\xe3\x4d\xea\xad\xe0\xd1\xf0\x42\x52\x06\x9d\xa5\x69\xe8\x49\x95\x01\xa8\x7f\x46\x52\xdb\x66\x5e\x31\xa7\x09\x73\x52\x9c\x0a\x27\x9f\x06\xb4\xaa\x88\x43\x5c\xd6\x4d\xb2\x5a\xab\x34\x0a\x7b\xce\xd2\x1e\x1f\x10\x2e\x4a\xb4\xb1\xca\x70\xb0\x96\x98\x60\x1c\x64\x1d\x21\x71\xc6\x4f\x3b\xab\xd5\xbe\x1b\x55\x06\x0e\x4e\xec\x3e\xb0\x79\x39\x23\xb7\x87\x80\x79\x07\x7c\x0c\x98\x77\x74\x99\xb7\x72\xa9\xfb\x15\xde\x07\xcc\xdb\x63\x19\x5d\xfa\x41\x6a\x72\xd2\x72\x5e\x18\xd3\x7e\x2b\x02\x48\x2a\x31\x73\x53\x2d\xae\x85\xc2\xb2\x41\x97\xb1\xf9\x38\x2f\x0f\xb3\xd6\x60\x21\xdd\x42\x83\x62\x37\xd8\xa5\xbe\x76\x5d\xbc\x47\xc5\x5a\xdc\xc3\x91\xe5\x46\x5d\x45\x4c\xaa\xf7\x5d\xb7\x4d\x00\xa3\x82\x25\x43\x55\xcb\x6a\x36\xea\x37\x49\xee\xac\xa8\xa2\xc4\x75\x80\x88\xe8\x9b\xa7\x7d\xd2\x99\x9c\x64\xf7\x5c\x16\x8f\x9a\xcb\xc2\x9c\xcb\xe2\xb1\x73\x69\x56\x34\xe7\xd2\x7c\x3b\xdf\xe6\x45\x96\x13\x4b\xc5\xcf\xec\x58\xdc\x8e\x19\xd7\xa7\x77\xd7\x2a\xeb\x87\x41\x9b\x9a\xa7\x6c\x3f\xf8\x71\x4d\x97\x2c\x2c\xef\x9d\x3f\x67\x07\x45\x0c\xcf\x9a\x6e\x74\x4e\xda\x9c\xa7\x3f\xaa\x4a\xb4\xcc\x02\xd6\x2a\x8e\x22\x96\xd6\xb5\xd5\xbc\xe7\x59\x32\x14\xe4\xb3\xa6\x68\xdf\xd6\xd4\xcc\xff\x86\xb7\xc8\xe7\x04\x72\x87\x04\x31\x1f\xf7\xf9\x26\x5d\x86\x37\xb4\x60\xdf\x7c\x85\xe3\x5f\xbe\x7b\xf7\x61\x3f\xfa\xdb\xf7\xcb\xec\xfa\xfa\xfa\xfa\xed\xc7\x9f\x57\x2f\x7f\x5e\xf2\x9f\xbf\xf3\x7f\xde\x3f\xbf\xfe\xf5\xfa\xfa\xfa\xc5\xcb\x8f\xaf\x7e\x79\xc1\x0b\xae\x3f\xbf\xfd\xf8\x61\xf4\xe3\x75\x5e\x7c\x35\xff\xe6\x3d\x2f\xf8\x2d\xfe\x38\x8a\x5e\x5e\xbf\xbd\xbe\xfe\x63\xff\xe2\xa7\xaf\x7e\xfb\xcb\xdf\x18\xb4\x4f\xf6\x1f\x5f\x25\x7f\x5c\x5f\x5f\xbf\x3b\xf0\x1e\x8a\xf7\xdf\x25\x1f\x8b\x77\xdf\xef\xf9\xbb\x68\xf4\xf1\x67\xff\xd5\x77\xdf\x16\x3f\x7c\xbf\x1f\xcd\xdf\xfc\x23\x2a\xfd\x9f\xe1\xc5\x6f\xd1\xcb\x5f\x7e\x8d\x5e\xbe\xdd\xdd\xfc\xdd\x4f\x6e\xd2\xf7\xd7\xef\x9f\xfd\x47\xf2\xeb\xe7\x0f\xc9\x6f\xcf\xbf\x7b\x46\x3f\x7f\xc8\x7e\x7c\x19\xfd\xc7\xa7\x5f\xbe\xfb\xbc\x7c\xff\xd5\x67\xde\x80\xbe\x4c\x5e\xbe\xff\xe5\x7d\xf6\x87\xfb\xec\x63\xf1\xe1\xd5\xf5\xfb\xef\x9e\xbf\xfa\xea\xb7\x6f\xff\xfe\x1f\x6f\xfe\xfa\xb7\xe7\x2f\x7e\xd9\x67\xfb\x34\xf9\xe6\xd7\xcf\xc5\xa7\xf5\xf3\x9f\x8b\xe3\xdf\xbe\xff\xfd\xb7\x3f\xe6\xc9\x5f\xfe\xf8\xfd\x8f\x67\xbf\xbe\xfe\xfd\xb8\x59\x5e\xa7\x39\x7b\xb5\x7e\xf1\x72\xf3\xc3\xef\x3f\xee\x7f\x79\xf7\x66\xb1\x89\xe2\x6f\x9f\xbf\x7c\xf9\x76\x9c\x7e\xbf\x79\x15\xed\x5f\x8c\x9e\x1d\x5f\xfe\xe3\x45\xf9\x6e\xf9\x9c\x6e\xd3\xbf\x14\xff\xf8\xf8\xe9\xc5\x0f\xcf\xc6\x3f\xfa\x9b\xf7\xd7\xe3\x9f\x6e\xbe\x2d\x7e\x63\xf3\xeb\xc3\xfc\xeb\xfc\xd9\x8f\xd7\x37\x63\x3f\xfa\xe6\xaf\x7f\xf9\xeb\xa1\x00\x48\x5d\x7f\xfc\xf9\x97\x77\x1f\xfe\xf6\xf5\xf3\x5f\x7f\xfc\x91\x58\x9d\xf2\x34\x67\x41\xc4\x9a\x3d\x25\xe3\x6a\xd1\x9e\x92\x31\xea\x16\xdf\xca\x1e\xd9\xad\x14\x39\x5a\x21\x22\xd6\x99\xdf\xc0\xe9\xa6\x8c\xd3\xc2\x68\xe5\xf6\x81\x33\x9c\xe0\x2d\x8e\xf0\x1c\x6f\xf0\x12\x2f\x30\xb8\x82\xaf\xe2\x02\x1f\xab\x0b\x63\x7c\x20\x23\xbc\x16\x72\xe4\x0d\x39\xf3\xf1\x9e\xff\x73\x4d\xce\xba\xa6\x87\xdf\xc1\x66\x59\x29\x3d\x47\xd8\x75\xa7\xba\xab\xe9\x3f\x1c\x60\x2f\x0f\x65\xce\xd6\x22\x0d\x0e\x81\x44\xe6\x90\xcb\x0b\x9d\xef\x74\xfa\xec\xed\xa5\x16\x65\xc2\x5f\xba\x4e\x09\xb0\x12\xf0\xf8\x29\x2b\x86\x66\xe5\x03\x7a\x4a\xb1\xaa\x08\xd0\xbb\xaf\xe6\xf4\x84\x3b\xb5\x09\x39\xaf\x39\x67\x89\x0c\xeb\x8e\x38\x00\x46\xa0\xb9\x17\x89\x50\x3e\xe3\x35\x29\xbd\x92\xe6\x4b\x56\x5e\xa9\x1f\x01\x6c\x3f\x79\xc1\x2e\x83\x54\x45\xd9\x3e\x15\x57\x7b\x7c\x81\x6c\x9b\x9f\xee\x4b\x88\xf7\x5c\x97\xde\xdd\x39\x79\x1d\x43\xfe\x28\x5b\x72\x9e\xcc\xc2\x14\x9c\x31\x9a\xef\xb6\x1b\x0b\xc7\x08\xe1\x5d\x2f\x8d\xd4\x69\xc5\x3b\x11\x7d\xd5\x41\xf8\x6c\x74\xc2\xb4\xa9\x15\x3b\xbb\x91\x8a\xb0\x33\x3f\x6c\xce\xbb\xba\x20\x93\xd3\x1e\x1e\x38\xf3\x0a\xb6\x4a\xf4\xa6\x70\x18\xba\xf8\x4a\x35\x1e\x85\x1a\x78\x2a\x55\x34\x04\x75\xae\xf1\xf7\x23\xe4\xaa\xe2\x1c\xe6\x9a\x90\x5d\x13\xe9\xaf\x1c\x4a\x62\x73\x75\x5d\x86\xa9\xb0\x8d\x5a\xc7\xa9\x43\x71\xdc\x5c\xd3\xb5\xd8\x54\xc3\x67\xa8\xaa\x48\x0f\x0e\xc5\xcd\xb5\x46\x01\x74\x6e\xb6\x6e\xf6\xde\x68\xe4\x36\xf0\xb0\xf1\x89\xe6\x50\xe5\x50\xdc\x67\x48\x45\x85\x90\x25\xe7\x63\xa5\x07\x5c\x1b\xec\xe9\x50\xc6\x86\xdd\xf5\xc9\x1f\xf8\xda\xb6\x53\xb9\x6e\x71\x07\x9e\x9e\x9d\xdd\xd8\xb6\x03\x9b\xf3\x9d\x8a\xf2\xea\x70\x8c\xd1\xa3\xf6\x77\x20\x54\xd7\x6b\x81\x53\xf7\xa0\x54\x75\xec\x5e\xdf\xdd\x89\x41\xa1\x93\x1e\x7f\x0a\xdd\x96\xf9\xb1\xda\xe9\x3d\xcb\x1e\x2f\x9c\x5d\x4b\x3c\xe3\x7b\x8b\x79\x71\xc1\x1b\xb0\xa8\xf2\x9f\x03\x4b\x92\x9a\x64\x44\x19\x7f\xff\xf9\x05\x2d\xb9\xe0\x46\x27\xa3\x29\xa6\x13\x7f\x2a\xdd\x53\xb5\x8a\x5c\xf0\x85\x8f\x3b\xe8\xb4\x88\x53\x9a\x24\xc7\xdb\xae\x8f\xfa\xa7\x93\x6e\x43\xa5\x91\xa9\x06\x5e\x8a\x14\x9e\x5b\xc8\xf4\xf4\x1c\x10\x9c\x23\x04\x50\x2d\xb1\x94\x2e\xab\x16\x9a\x37\x6f\x12\xed\xbe\xf6\x92\x33\x6e\xf5\x51\x59\xc0\xc8\xdd\x74\x09\x99\xb5\xe4\xc3\x45\xdc\x6d\x30\x73\xe6\xec\xef\xee\xce\x32\x48\xe0\x73\xd6\x07\xff\x1a\xc8\xb6\xed\xb4\x88\xdc\xbe\x49\xe4\x34\x1a\x46\x6a\x1a\xd6\x4f\xad\xb6\xbd\xd4\x2a\x42\x12\x61\xb6\x2d\xf2\xb3\xff\x57\x91\x9f\x5e\x2c\xc4\x31\x44\x7b\xd5\xf6\x2e\x4e\x09\x6d\xd0\x06\x9c\x91\x74\x18\x87\xb1\xcb\x2e\x48\x83\x2e\x5c\x39\x71\xb3\x08\xa7\x24\x76\x33\x14\xa4\x2e\xbb\x6c\xbe\x6b\x92\x91\x2b\x27\x7d\xa8\x0a\x8e\x49\x3a\xcc\x50\xe0\xc4\x2e\x61\x38\x75\x09\x53\xce\x7e\x6d\xe4\x6c\x60\x4d\xbb\x82\x46\x72\xe2\x61\xa1\x48\x4e\x0b\x49\xf5\x30\xd6\x75\xb5\x7b\x28\xd3\x5c\x52\xa6\xa8\x93\x32\xed\x6d\xdb\x01\x8e\xe1\x3e\x6a\xb4\xbd\x8f\x1a\x45\x88\x93\x9a\xb9\x22\x35\xf3\x16\xa9\xe9\x24\x24\x3a\xc5\xd0\x32\xfe\x95\x4e\x1f\x36\x20\xa3\x09\xd8\x97\xab\x34\x79\x0f\x92\x8f\x4d\xfb\x30\xb5\xed\xb3\xbd\xa2\x24\x7c\x37\x5e\x59\x30\xd5\xa0\xa2\x9f\x21\x3b\x23\x7d\x54\xd6\xb6\x9d\x5e\x02\xcc\x10\x04\x3b\x32\x6c\x87\xca\x6c\x3b\x5f\x09\x76\xa2\xde\x9f\x10\xa8\x45\xb0\x24\x70\xc9\x53\xdd\x5f\x5e\x31\xa7\xf1\x82\x73\x5b\xb6\xdd\xdc\x76\x81\xe8\x17\xc6\xfd\x98\x6e\xe9\x23\xbb\x8d\xc1\xbe\x67\xf1\x4f\x4d\x21\xf9\xd7\x4c\x61\xfb\xc8\x6e\x23\x98\x42\xf3\x52\xa3\xba\x2b\x24\x13\x7d\x3e\x58\x3c\x80\x75\xa9\x36\x1e\xf9\x5b\xf4\x6c\x4d\xa5\x91\x36\xd5\x8d\xb4\x35\x8c\x6c\xc5\x2a\x2d\x31\x9d\xc4\x53\xb8\x78\x91\xc6\xa4\x8d\x1b\x17\xc7\x8a\x1b\x29\x64\x2c\x5c\xd4\x39\x64\x72\xba\xfc\xb1\xf8\x89\xa6\xcd\x3c\x33\xa8\xb7\xbb\x0d\x4d\x5f\x46\x4b\xa6\x52\x9f\x58\xd8\x67\xc3\xaf\x04\x41\x7a\xa1\x32\xa4\x66\x1b\x96\xd3\x2b\xed\xc0\x08\x34\x56\xb7\xa1\xf3\x6a\x4f\xa9\x43\x02\xc2\x2f\x30\x6b\x5e\x90\x74\x37\x6c\x52\xb2\xc7\xb7\xac\xf5\x44\xda\xc0\x71\xf2\xe7\x1a\x8b\xb5\xdd\xc8\xc6\xed\x5b\x58\xdb\x76\x66\xdd\x33\x5d\x22\x3c\xeb\x99\x4a\xfd\xaa\xfe\xdc\xa2\xa9\x97\x6e\xaa\xd4\x7b\xd4\xd2\x86\x6e\x08\x34\x1a\x8c\xe6\xc0\x89\x8c\xf0\xa8\xa5\x16\xf3\xf6\xed\xa2\x15\x0a\x39\xe1\xad\x54\xe6\x6f\xe2\x34\xfe\x29\xc9\xca\x99\x83\x4e\x73\x5a\xce\x57\x7c\x47\x1b\x57\x66\xa5\x8c\x69\x60\x7c\x5b\xf3\x82\xb9\x5f\x87\xf8\x1d\x9d\xff\xbe\x04\xcf\xb5\xda\x2b\x06\x81\x5e\xa4\xf6\xbd\x79\x6c\x0f\x1f\xa1\x8d\x8c\x9a\x8b\x4b\xc3\x25\xa6\x54\x2e\x31\xde\xd7\xd8\xfb\x9a\x3f\x4b\xa7\x18\xef\xeb\x0e\x20\x0c\x8d\x2a\x6d\xb8\x0d\xff\x74\x2b\x51\xa5\x0a\x91\xd2\x5a\xe4\x0a\xde\x8f\xb8\x78\x30\xc0\xc0\x1b\xbd\x8a\x93\x44\x4d\xff\x21\xb0\xa9\xfa\xdf\xe7\x34\xe2\x1c\x95\x6a\xd7\xa1\x8a\x6e\xb5\x33\x00\x0d\x77\x1d\x77\x77\x55\xcc\xbd\xf6\xfd\x48\xc9\x36\xbc\x15\xc4\xb2\x15\x50\xc9\xd6\x9b\x6d\xc9\x9e\x67\xeb\x9b\x38\x65\x91\x30\x0e\xbb\xe6\x28\xb0\x8e\x45\x16\xd1\x9c\xa4\xde\xf1\x0d\x3d\x0c\xf9\x9f\x38\xc5\x59\x07\x7e\x2b\x03\xe8\x5e\x8d\x43\x52\x8b\x72\xc5\xc4\x9f\x0e\x39\xc5\xe7\x84\xed\xd9\x08\xe1\x15\xe9\x5e\x20\x74\x9e\xe0\x6d\xc7\x3b\x58\xdc\xf3\x1c\x47\xa4\x7b\x5d\xe7\xed\x72\xde\x04\x6f\x84\x76\x65\x09\x7f\xc2\xcc\xc0\xc9\x4c\xc3\xc9\x79\x6d\x42\xb8\x20\xa3\x70\x71\x91\x72\xde\xa6\x3a\x31\x16\x75\x9e\x7f\xf1\x62\xb2\x98\xe2\x1d\x91\xee\x15\xb3\xc9\x68\x7a\xe5\xf0\x7f\x61\x8e\xe8\xe9\x2a\x78\x4b\xdf\xe2\x63\xfd\xde\x9f\x5e\xcd\x87\x0e\xff\x2b\x21\x8a\x9e\x6e\x79\x9d\xd0\x89\xef\xee\x64\x46\xdd\xcd\xdd\x9d\xe6\x47\xba\x43\x67\x44\x7b\xdc\x40\x44\xb2\x2a\x59\xfd\x0e\xd9\x76\xf5\x70\x44\x57\x2a\x2b\xef\xe6\x2a\x53\xf8\xbf\xc3\x73\x14\xc4\xb6\xad\x15\x2c\xf9\x9c\xab\xa7\x23\xc2\x1b\xb2\xc3\x4b\x72\x44\x81\xca\x47\xba\xe1\x1f\xb9\x72\x7a\xdb\xcc\x11\x0a\xaa\xc7\x0d\x7f\xc4\x1b\x22\x80\x2b\x42\x6e\x55\x2f\x23\x3c\x47\x10\x77\xa3\x76\x75\x2b\x55\xa8\xc1\x0e\x7a\x25\x74\xc5\x22\x1d\x96\xda\x12\x40\x34\x47\x7c\x69\x98\x6d\x43\x0e\x40\x40\xf9\x8f\x65\xb6\x71\x46\xfc\x00\x6a\x94\xf9\xb8\x6c\xde\x0f\x40\xdf\x8b\x38\x49\x04\x25\x3b\xe0\x0c\x9e\x1c\x74\xa2\xea\xc6\xd2\xac\xab\xd3\x3d\xda\xd5\xd9\x63\x09\x2b\xdf\x71\x3a\x49\xcd\x34\x3f\xbf\x86\x9a\xfc\xfe\xdd\xd8\xa1\x61\x34\xf7\x5d\x17\xc9\x48\xb2\x25\xdc\x9e\x59\x08\x8c\x15\xf5\xec\xb8\x38\x25\x4c\xb7\x40\xe6\x52\x18\xdb\x0f\x44\x6e\xda\x18\xe1\x82\x4b\x14\x09\x61\x66\x2a\xdb\x95\x72\xb8\x2b\x89\x1f\x96\x17\x71\x9d\xda\x64\xdb\x7d\x23\xfb\x63\x6a\xde\xc9\xe2\x14\xb2\xd7\xac\x84\x89\xf0\x16\x61\x89\x71\x5b\x88\x02\xc9\xc5\x8f\x78\xe1\x14\xa8\xf9\x89\x6c\x52\x4e\xc9\x6a\x52\x0e\xfd\x69\x9d\x8c\xb6\x55\x21\x11\x15\xa4\xe7\xf3\x14\xcf\x09\x83\x5d\x2a\x03\xc8\xcf\xf0\x86\x30\x3d\x47\xb8\x36\x13\x13\x38\xd0\x25\x47\x63\x3e\x58\x98\xde\x92\xcc\x3d\x76\x28\x39\x63\x26\x8d\x68\x59\x95\xed\x1f\x97\x78\x83\x42\xa6\x25\x49\x76\xd0\xa5\x6f\xdb\x0e\x6f\xc4\x0b\xe3\x74\x79\xbd\x63\x39\x5d\x32\x67\x89\xcd\x7a\x78\x83\x10\x8e\x04\x34\x96\xe2\x82\x73\x51\xc3\x78\x14\x96\x17\xd1\x64\x34\x35\x12\xc9\x28\x02\x35\x23\x23\xbc\x23\x23\x7c\x24\xa3\xf0\x58\x5b\x8b\x1f\xd5\x8a\x1c\x48\x34\x39\x4e\x27\xe5\x74\xe2\x4f\x43\x49\x18\x0e\xca\x80\xf8\x80\xee\xee\x9c\x9d\xeb\xe2\x99\x4b\x0e\xe8\xb4\x10\x23\x98\xf0\x8f\xf1\x16\xa3\x29\x9e\x9d\xef\xa6\x62\x40\x6b\xf2\x16\x72\xe8\x7a\x6f\xae\x3f\xcf\x7e\xb9\x7e\xfd\xf3\x4b\x7c\x43\x86\xcd\x32\x6d\xc8\x8b\x56\xe2\x9b\x3d\x59\x68\x03\x39\x23\x64\xaf\x11\xae\x3d\xa7\x69\x67\xf4\xee\x6e\x7f\x09\x91\xd1\xd6\xb5\xa6\x70\x8d\xf7\x08\xdf\xd4\x07\xc8\x0d\xde\x0b\x02\x43\x01\x45\x6e\x48\xee\x25\xd9\xd2\x1f\x39\x37\x08\xdf\xb8\xc4\x1b\x7f\xfd\xf4\x06\xaf\xab\xd2\x35\xc2\x1d\x23\x92\x43\xa9\x6a\xc9\x67\x54\xdb\x4e\x5f\xe3\x77\xe4\x66\xb8\x0e\xaf\xc9\xbb\x8b\x6a\xf2\x3f\xbe\x15\x13\xbd\x82\xaf\x04\xfc\xdf\x77\xfc\xa3\xd7\x78\x3d\x24\xd7\xf2\x16\xfe\x16\xae\x84\x16\x98\x13\xf7\x60\x8d\xf9\xe1\x19\xdc\x34\x76\x7a\xcb\x38\xa2\x87\xc9\xe8\x3d\x51\x9b\x57\xe0\xf0\x1e\xf6\x99\xf0\xa7\xe0\xe7\x4b\xc9\xd7\x30\xae\x21\x37\xc2\x0e\xe3\x27\x13\xb8\xbb\x9e\x43\xde\x2e\xfd\x5d\x29\xee\x04\x7c\xf1\x2e\x6f\x1f\xa3\x07\xb7\x7d\xe2\x3e\x8d\x15\x47\xf0\x60\x4d\xc7\x1f\xa6\x9c\xa8\x54\xdf\x6c\xd5\x39\xb6\x59\xb9\xa3\xdb\xc5\x01\x74\x71\xf6\xf2\x96\x07\x9d\x8f\xc1\x8a\xb3\xab\x86\xd2\xde\x74\xbe\xd4\x54\x32\xf9\x30\x31\x9c\x49\xba\x2a\x96\xd9\x46\x65\x16\xeb\x94\x26\xf4\xfe\x32\xa3\xbf\x9e\x9a\x10\x90\xed\xde\xef\xdd\x37\x1c\xfd\x4e\x53\xba\x66\xdc\xff\xb9\xae\x06\x6d\x26\xf8\x5e\xcb\x20\x0d\x4f\x17\xff\x1d\xe2\x8e\x66\xda\x61\x72\x75\xbe\x3a\xd8\x4c\x2c\xf0\x71\xcd\xe3\xf6\xe8\xbf\xbf\x44\x7c\x79\x95\xe5\xac\x5b\x7c\x79\xec\x49\x5f\xf7\xa0\x9f\xf7\x71\x43\xdb\xae\xed\x3a\xbf\x79\xaf\x31\x6c\x6f\x25\xbe\x15\x2b\x62\xc8\xda\x97\x32\x1d\x2d\xc2\x52\xe3\x74\xac\x7c\x79\x43\x9d\xf1\x57\x23\x3c\xa8\xff\xb1\xdc\xfb\x67\x72\x9d\x6c\x56\xd4\x42\x95\x0d\xb1\x88\x6c\x8f\x45\xbf\xd5\xba\xa6\x5d\xcb\xa8\x57\xca\x3b\x17\x7f\x98\xf7\xb4\xeb\x14\x13\x7d\xec\x6b\xb2\x5c\xda\x78\xa2\xda\x53\xde\x78\xd2\x6b\x32\xf1\x54\x89\x7b\xc0\x41\x3c\xea\x8b\xbe\xd1\x2b\x6b\x3c\xf9\xfd\x42\x64\x17\x56\xf6\x6c\x9f\x1e\x42\x85\x99\x08\x7b\xfc\x2a\xc9\x68\xb7\xe2\x46\xa3\x32\xc8\x2d\x31\x6d\xd5\xbf\x87\x2c\x21\xb7\x0c\x55\xdc\x4a\x1d\x07\x03\x86\x4d\x14\x0b\x28\x56\x18\x1c\xb0\xa1\x7f\xd9\xc6\xb8\xbb\x3b\xea\xfa\x17\x8f\x3a\x06\x8c\xf8\xa3\xdb\x47\xb8\x41\xf4\x65\x50\xed\xce\x6e\xda\x4a\x6f\x7a\x9a\x9e\xf0\xed\x09\x4f\xfc\xbf\x4e\x91\xe3\xff\x15\x9d\x50\xf8\xbf\xce\xcf\xff\x6d\x50\x64\xdb\x7c\xce\xde\xd0\xcd\x26\x4e\x97\x3f\x7f\x78\x4d\xa2\xb8\x28\x55\x97\x7c\xaf\x79\xff\x55\x78\x6b\xba\xf9\x7f\x02\x00\x00\xff\xff\x0d\x37\xaf\xaa\x32\xe4\x01\x00"), - }, - "/html2canvas.min.js": &vfsgen۰CompressedFileInfo{ - name: "html2canvas.min.js", - modTime: time.Date(2018, 8, 13, 14, 28, 13, 35498020, time.UTC), - uncompressedSize: 166138, - - compressedContent: []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xec\xfd\xfb\x77\xe3\xc8\x75\x20\x8e\xff\xbe\x7f\x85\x84\x8d\x69\xa0\x59\x44\x03\x24\xf5\x02\x1b\xad\x03\x4a\xec\x6e\x7a\xd4\xa2\x9a\xa2\xfa\x61\x0e\xad\x03\x91\x25\x0a\x6e\x08\xa0\x81\xa2\x1e\x96\x78\x8e\xd5\xed\x78\x1d\xdb\x13\xbf\xd7\xf6\x3a\x8e\x63\xaf\xd7\x71\xfc\x58\x3f\xb3\x19\x27\x5e\xef\x3f\xf1\xdd\x93\x9f\x77\x39\xe3\x38\xdf\xcc\xe7\x7f\xf8\x9c\x7a\x01\x85\x07\xa9\xee\xf1\xf4\x24\xe7\xe3\xcc\xb4\x40\xa0\xea\x56\xd5\xad\x5b\x55\xb7\x6e\x55\xdd\x7b\xeb\xe6\x8d\xc5\xff\xb0\x70\x63\xe1\x08\x1d\xbb\xe5\xbe\xed\x9d\xd8\xe1\x82\xae\x6a\xaa\x56\xb2\xdd\xd1\x91\xad\xea\xfa\xc2\xad\x23\x84\x46\xa1\x71\xf3\xa6\x00\xa3\x1e\xc1\x00\x7d\x1c\x7a\x6a\xdf\x3f\xbe\x8d\xd3\x6f\xf8\xa3\xf3\xc0\x19\x1e\xa1\x05\xb9\xaf\x2c\x94\x35\x7d\x75\x61\xdb\x79\xea\xda\xe1\xc2\x89\xef\x2d\xdc\xa3\xd0\x42\x56\xa9\xe4\x6d\xe8\x42\x3b\x84\x83\x85\xb1\x37\x80\xc1\xc2\xfd\x66\x67\x61\xcb\xe9\x43\x2f\x84\xff\x61\xe1\xc6\xcd\xff\xb0\x78\x38\xf6\xfa\xc8\xf1\x3d\xd9\x02\x50\xb9\x90\xfc\x83\x8f\xc2\x3e\x92\x4c\x13\x9d\x8f\xa0\x7f\xb8\x00\xcf\x46\x7e\x80\xc2\x42\x21\x13\x73\xec\x0f\xc6\x2e\x5c\xa7\x3f\x2a\x83\x33\xa1\xac\x18\x12\xcf\x33\x06\x1e\xc0\x43\xc7\x83\x85\x02\xfd\x55\xed\xe3\xc1\x3a\x7d\x95\xbb\x3d\x00\x15\x63\x56\xb9\xeb\xec\x57\x15\x28\x44\xca\xb0\xd2\x21\x13\x19\x1d\x39\x21\x88\xaa\xa3\x5c\x04\x10\x8d\x03\x6f\x21\xae\xa0\x72\x71\x62\x07\x0b\xd0\xbc\x98\xd4\x78\xe0\x02\x92\x03\xe5\xc2\x39\x94\x61\x37\xe8\x29\x2c\x05\x7e\xe7\x15\xaa\xe1\x24\x9e\x89\x83\xcc\x0b\xc7\x08\x80\x6b\x2c\xea\x80\x45\x1a\x17\x93\x49\x8d\x25\xb2\x70\xa2\xbe\xed\xba\xb2\xc7\xd3\x02\x0f\xc4\xef\x48\x01\x9e\xea\x9a\x8b\x5a\x1c\x36\x61\x49\x91\x7a\x6c\x5a\x00\xa9\x7d\x13\x02\xa4\x0e\x4c\xb1\x49\x40\xa0\x5c\x20\xd5\x27\xad\x73\x79\xd9\x22\x54\x52\x29\xe9\x76\x02\x7f\x04\x03\x74\x4e\xc0\x2e\xfa\xbe\x77\xe8\x0c\xc7\x81\x7d\xe0\x42\x82\xa2\x37\x3e\x86\xec\x4b\x03\x43\x88\x8c\x60\xa2\x4c\x00\x52\x3d\x33\x4b\x11\xab\x50\xb0\xd4\xfd\x7d\x18\xde\xa7\x8d\x9a\xa5\xa2\x85\x0b\xb5\xc7\x2e\x9a\x18\x39\x91\x11\x15\x90\x3a\x90\x21\x90\x6c\x09\x40\x05\x40\x5c\x9c\x6f\x26\x7b\x18\x03\x64\x35\x19\x05\x3e\xf2\x71\x93\xab\x47\x76\xd8\x3a\xf5\x78\x9d\x28\x25\x71\x02\x9c\xc7\xc8\x94\x24\x80\x64\xa4\x86\x66\x79\x45\x99\xc8\xdd\x04\x85\x90\x72\x21\x8d\x43\xb8\x10\xa2\xc0\xe9\x23\xa9\x96\x4f\x24\x08\xa4\xb8\x82\x12\xb8\x38\xb1\xdd\x31\x26\xcd\x44\x21\x4d\x1c\x98\xf3\x7a\x0e\x46\xdc\x39\x94\xad\x20\xb0\xcf\x55\x27\x24\xbf\xb2\xa5\xf0\x0e\x63\xd5\x9c\x43\x79\xf7\xfc\xf8\xc0\x77\x55\x07\xc1\xc0\x46\x7e\xb0\xe0\xf0\x4a\x0a\x80\xc9\x1c\x71\xb9\xc8\xec\xf6\x40\x40\xba\x85\xb9\xa8\x83\xba\x79\xe2\x3b\x83\x05\xad\x86\x82\xf3\x8b\x43\x3f\x90\x31\x8c\x0d\x42\xd3\xea\xa6\xf2\xef\xc9\x4a\x6d\x51\x0e\x4c\xd9\x36\x43\xd5\x83\x67\x48\x56\x14\x75\xe0\x7b\x50\x29\x14\x64\xa4\x8e\xc6\xe1\x91\x6c\xab\xa4\x96\x0a\x58\x84\x97\x97\x48\x75\xa1\x37\x44\x47\x8b\xa6\x09\x95\x1a\x2e\x52\xa9\x4d\xfa\x36\xea\x1f\xe1\x7e\xe0\x61\x14\xea\xa6\x35\x39\x74\x3c\xdb\x75\xcf\x2f\x30\x02\x8b\x41\xa1\x10\xaa\x14\xf7\xf8\x4d\x56\x22\x20\xe7\x50\xf6\x14\x74\x14\xf8\xa7\x0b\xf5\x49\xd4\x9d\x27\xa4\x7a\x35\x1a\xee\xc1\xd3\x85\xce\xf9\x08\x36\x82\xc0\x0f\x64\xa9\xe9\x9d\xd8\xae\x33\x58\xb0\x11\x82\xc7\x23\xb4\x80\xfc\x85\x01\x0c\x51\x30\xee\xa3\x71\x00\x17\x3c\xdf\x2b\x91\x1a\x1e\xb8\x70\xc1\xf1\x42\x64\x7b\x7d\x28\x29\x93\x89\xac\x00\x4f\x6c\xa2\x68\x00\x5b\x94\x96\x9c\x56\xc8\xd4\x6a\xe8\x16\x64\x75\xad\xa1\x62\x91\xd2\x39\x30\x61\x17\xf5\x6a\x81\x1a\x8f\x0b\x53\xfc\xb8\xbc\x5c\xd4\x41\xa0\x8a\xa3\x08\x53\x44\x22\x04\x94\x1c\x6f\x21\x28\x14\xe4\x40\x3d\x0d\x1c\xc4\xe2\x14\x30\x6b\x34\x06\xea\x53\x78\x0e\x02\x25\xa2\x48\x84\x37\x04\x08\x0f\x68\x4e\xa8\x42\xc1\x92\x61\x3c\x06\x30\x8f\x08\x48\x18\x08\xf0\xe8\x99\xc8\xb4\x6f\xd6\xcd\x9b\x1f\xf9\x8f\x72\xd7\x2e\x1d\x6a\xa5\xb5\xde\x45\x65\xa2\xfc\xc9\x4d\x07\xd8\x79\xe3\x58\x3d\x26\x0d\x5a\x57\xd8\x80\x5c\x5c\x84\x85\x42\x77\x64\x07\x21\x6c\x7a\x48\x86\x5d\xbd\xd7\xd5\x7a\x45\xf6\x0b\xf4\x65\x05\x24\x23\x75\x16\xa9\xe7\x45\x96\x59\x64\x99\x46\x7a\x63\xd7\xed\x4d\x40\x98\x44\x6f\x99\xa2\xe7\xcf\x41\x2f\x9c\x83\x9e\x1a\x8e\x0f\xf0\x48\xf6\x86\xb2\x06\xca\x4a\x16\x0b\x01\xa0\x0c\xaa\xf3\x01\xaa\x60\x59\x11\x51\x75\xcc\x9b\x1f\x09\x86\x07\xaf\xcb\xaf\x87\x37\xe4\xd7\x07\x17\x3a\xa8\x4c\x94\xd7\xc3\x1b\xe0\x9a\xef\xd7\x95\x3f\xb9\x09\xfa\x73\x6a\xe4\x24\x6b\xb4\x3d\x3e\x3e\x80\x01\xc1\x46\x01\xd1\x47\x59\xfc\xa8\xf4\x22\xac\x5c\x8a\x95\xfd\xd2\x68\xb1\xef\xf5\xd7\xd5\xf5\xd7\x07\xc5\x08\xd1\xf1\x1c\x44\xdd\x18\x51\x19\x16\x0a\x7c\xa0\xdc\xae\x2a\x2f\x8e\x76\xf4\x51\xed\x29\xbd\x09\x78\x90\x28\x8e\xe6\xde\xbd\x6f\xa3\x23\xf5\xd8\xf1\x64\x0b\xf7\xb3\xf2\xd2\x92\x02\x84\x20\x3d\x1b\x54\x66\x41\x16\xc7\xa8\xb2\x6e\x75\x2b\x3d\x83\xd1\xe8\x34\xa7\x4e\xc3\xae\xa5\x22\x7f\xcb\x3f\x85\xc1\x86\x1d\x42\x59\xe9\xf1\x69\x88\x0c\xe7\x09\xd8\x9b\xc1\x31\xa0\x72\xb1\x98\x61\xee\x8b\xb2\x15\x71\x1c\x2c\x80\x28\x4a\x2e\x03\xdb\xb0\x3d\xcf\x47\x0b\x78\x7e\x5a\xb0\x17\xfa\xae\x1d\x86\x0b\x76\xb8\x60\x47\x83\x5c\xe2\xa2\x88\x45\x47\x2f\x32\x93\xd3\x06\x54\xd6\x1f\xc8\x50\x31\x6c\x19\xcf\xe8\x7d\xf2\x1c\x93\xe7\x29\x79\xfa\xe4\xd9\xd5\x00\xfe\x9f\xd4\x1e\x78\x66\x20\x23\xdc\xd7\xeb\xa6\x87\xc9\x19\x9a\x1e\x26\xa1\x63\x7a\x98\x6c\xae\xe9\x75\x2b\xbd\x1a\x2e\x53\x0d\xcc\x3a\x20\x2f\x43\x33\xa4\x2f\x07\xa6\x43\x5f\x6c\xd3\xe5\xfc\x08\x57\xba\x7b\xf1\x14\x9e\x1b\x92\x13\x76\x02\xdb\x0b\x47\x76\x00\x3d\x24\x01\x3a\x2b\x66\xa7\x42\xcd\x34\x4d\x9a\xcb\x64\x02\x68\x4a\xe4\xef\x92\x41\x36\x3b\x11\x46\x7e\x91\xa7\x2b\x14\xf4\xe8\x7d\x5d\xc2\xdd\x5d\x96\x8a\x14\xe7\xa2\x04\xd8\xeb\x30\x7e\x3d\x88\x5f\xed\xa2\xa4\x48\x06\x4e\x73\x6d\x12\x45\x9a\x4c\x7a\x0a\xb0\x30\xeb\x84\x5c\x64\x31\xf7\x48\x43\x0c\xcd\x0b\x14\xd7\xd5\x60\x14\xd6\x7a\xc0\x76\x9d\x3e\x3c\xc0\x75\xe8\x96\xab\x1a\x28\x57\x57\x71\x57\x64\xb4\xb7\x3d\xe4\x7c\x6c\x0c\x4f\x8f\x1c\x84\xe3\x97\x34\x50\xae\x2c\x81\xb2\x1e\xc5\x7f\x6c\x6c\xe3\xbc\x70\x0a\x21\xd5\xc7\xc6\xf6\xb1\x1d\x38\x1e\x34\xba\x7a\x79\x85\xc6\xea\x65\x1e\xfb\xf1\x71\xc0\x0b\x4b\x24\x3b\x80\xce\x90\x44\x2c\x01\xf2\x57\xe6\x3d\xe0\xc0\x09\x3f\x46\xf0\xc3\xe0\xe5\x55\xa0\xaf\x2d\xf3\x18\xd7\xee\x3f\x35\x12\xdd\xe5\xc0\xb5\xbd\xfe\x11\x1c\xd8\xee\xb1\xef\x0d\x58\x22\x8c\xb4\x16\x95\x43\x2a\x8b\x53\x08\x65\xbb\x63\x78\xe2\xf8\x2e\x44\x46\x57\xaf\xac\x82\x6a\x05\x94\xcb\x51\x29\x81\x7f\xea\x19\x5d\x7d\x79\x09\x54\xcb\xf8\x1f\x0b\x1e\x07\xee\xf9\xa9\xef\xe3\x42\xca\x65\xa0\xaf\x56\x81\x5e\xe1\x19\xf6\xed\x01\x44\xb4\xa4\xb5\x25\xa0\x2f\xad\x02\x7d\x99\xa3\xd8\x3f\xb2\x03\x14\xc0\x71\x28\xd0\x27\x8e\xf3\xfb\xbe\x6b\x13\x72\xeb\x1a\xd0\xb5\x25\x50\x89\xe2\xfc\xc0\x76\x69\x8d\x70\xb2\x55\x21\xdc\x3b\x74\x31\x27\xa0\x05\xea\x9a\x06\xf4\xea\x1a\x28\x57\x56\x04\x88\xd0\x71\x9f\x32\x72\xe0\x36\x8e\xa8\xdb\x0f\x9c\xe3\xd0\xf7\x70\x25\x34\x50\xd6\x40\x8c\xe6\xb9\xed\x65\x1b\x77\x60\x07\x4f\x63\x0a\xea\x95\x35\x21\x9c\xa7\xc0\xa1\xc9\x98\xa1\xef\x0e\xa0\x17\x60\x5a\x51\x3a\x55\x81\xae\x8b\xf1\x81\x7d\x8e\x29\xbc\x06\xf8\x9f\x18\x07\x21\xcd\x56\x8b\x9b\x99\x45\xcc\x4c\xf4\xf4\xc8\x7e\xea\xe0\xc2\xd6\x80\xbe\x5a\x01\xba\xb6\x22\x44\x1e\xdb\x43\xe8\x21\x1b\x37\xf5\x5a\xa6\x12\xbe\xeb\x9c\x40\x56\xe6\xea\x12\x49\x59\x15\x13\xfb\x81\xed\x0d\x59\x6f\xd4\xab\x49\x8c\xfc\xa0\x7f\xe4\xe0\x3a\x2e\x55\x00\x1e\x2c\x5a\x55\x88\x0c\xe0\x80\x97\x28\xa6\x09\x49\x4f\x35\xba\xe5\x4a\x05\xe8\x4b\x1a\xd0\xcb\x65\x31\x16\xda\x0c\x17\xbd\x5a\x01\xfa\xea\x2a\xc0\xbf\x42\x3c\xee\x2b\xb4\x3d\x56\xca\x60\x59\x4f\x55\x86\x44\x53\xe2\x56\x57\xc0\xca\x1a\xfe\x97\x89\x85\xf9\xb1\x68\x1c\x7c\x6c\xec\x3b\x21\x69\xea\xb2\xb6\x0c\xca\x9a\x18\x1d\x0d\x97\xea\x2a\x1e\x4a\x71\x73\x42\x38\x1a\x39\x1e\xef\x6b\xb8\x2b\xae\x08\x51\xe1\xd3\x73\xde\x7d\xf4\x35\x5d\xec\x58\xce\x31\xeb\x05\xda\x12\xe0\x7f\x42\x14\xcc\x8f\xf2\x07\x43\xde\xef\x2b\xb8\xac\xaa\x90\xe5\xa1\x13\xc0\x83\xc0\xc1\x2c\x42\x5f\x59\x05\x95\x2a\xfe\xc7\xa2\x5c\x3c\x98\x22\xc6\x86\x7b\x38\x66\x7e\xbc\x61\x0e\xfd\x00\x86\x88\x51\x1e\x77\xd6\xca\x9a\x90\x76\xdc\x3f\x0a\x1d\x9b\xa6\x13\xb9\xc8\xd0\x76\xbc\xf0\xc0\x0f\x7c\x36\x98\xd8\x1f\x8b\x3c\xf2\x43\xc4\x0b\xc4\x23\x30\xc1\x69\xf1\x00\x61\x88\xe8\x31\x37\x10\x86\x4d\x59\xc7\x2c\x64\x09\x54\x78\xef\x60\xc4\xc2\xfc\x90\xfd\xf1\x70\x3e\x5c\xca\xab\x71\x46\x38\xf0\x1c\xba\xae\x7f\x8a\x69\x51\x21\x25\x47\xed\xc2\x88\x9b\xc9\xea\xc8\xf7\xe0\xf9\x00\x9e\x0a\xdc\x3a\xa2\xd0\x91\x8f\xe2\x56\x26\x6d\x12\xf1\x23\xc7\x1b\x38\xb6\x47\xba\x3b\xe6\xba\x6b\x65\xfc\x2f\x8e\x1a\xfa\x46\x77\x65\x89\x8c\xbb\x28\xc5\x89\x1f\x9c\xf3\x76\x10\x4b\x61\xc3\x98\x14\x4f\x9a\x97\x47\xb8\xf6\x09\xf4\x06\x30\xc0\xe3\x86\xc6\xe1\x06\x4c\xc6\x1d\xb8\xe3\xf0\x88\xb3\x3c\x8d\x4c\x2a\x1c\xe0\xd4\xe3\xa3\xaa\x8c\x3b\x4c\x39\x22\x94\x0b\x8f\x7d\xaf\x7f\xe4\x1c\x1e\x92\x31\xc9\x3b\x46\xd4\xdf\x5c\x67\x78\xc4\xf8\x3a\x21\xa3\xbe\x4c\x0a\x17\x22\x39\x97\xae\x6a\x29\x6a\xd2\x58\xc2\x22\xcb\xe5\x6a\x8a\xad\x92\xc8\xa8\xb9\x79\x4b\x91\xb2\xf1\x9f\x9e\x28\x82\x36\x3d\x1e\x72\xfc\x2f\x11\xc9\xd8\x45\x15\x94\x2b\xab\x64\x44\x24\x63\x67\x27\x15\x1a\x74\xb5\x0c\xf4\xb5\x8a\x18\x19\xf1\x29\x1c\xbd\x2c\xf2\x29\x1a\x1d\x31\xaa\x4a\x19\xe0\xd1\xa6\xaf\x24\x70\x8e\xc6\xbd\x4e\x26\xe3\x65\xb1\xbd\x48\x7c\xcc\xa9\x74\x1d\x4f\x1f\xcb\x00\x73\xd1\x2c\x04\x9c\x03\x81\x20\x74\x79\xe3\x2c\x13\x39\xa1\x9c\xc4\x32\x26\x2c\xeb\x69\xe5\x98\x3a\xc7\x90\xcf\x76\x9a\x10\xc6\x2a\xc5\x3a\x81\x80\xb3\x07\x3d\xd6\x40\xac\x73\xd2\x88\x68\x6e\x49\x33\x87\x63\x3b\xf0\x7d\x8f\x0e\xb3\x78\x06\x38\x86\x03\x67\x7c\x9c\x90\x98\xb4\x32\x29\x2a\xa6\x1f\x85\x11\xc4\x96\xa8\x37\xd2\x98\x68\xd6\x59\x5d\x06\xab\x4b\x42\xa3\xd2\xe8\xd1\x38\x18\xb9\x38\xe3\xea\x0a\xd0\xf5\x32\x28\xeb\x6b\x89\xf8\xb8\xe5\x70\xab\xae\xac\x01\x5d\xaf\x24\x01\xe2\x39\x46\x2f\xe3\xb9\x94\xf6\xac\x04\xc8\x08\x4b\xc3\x11\xeb\xc1\x64\xd1\x97\xaa\x09\x10\x61\x3a\x59\x29\x93\xb9\x24\x9e\x1e\x29\x04\x9d\x51\xe8\x34\xb9\xb6\x06\xca\x78\x32\x8b\x30\x71\x06\x5e\x3c\xf4\xca\xb8\xf5\x48\x65\x78\xac\x87\xfa\x01\xb4\x8f\x99\xf8\xc8\x86\x2d\x8f\x0c\xd1\x79\xe0\x87\x82\x04\x59\x2e\x47\x14\xf4\xfb\x7d\x3b\x74\x3c\x41\xba\x5c\xe5\xe4\xf3\xec\x13\xfb\xa3\xbe\x38\x47\x60\x31\x6f\xa5\x12\x47\x9f\x33\x29\x28\x1a\xe3\xbe\x3b\x70\xed\x3e\x01\xaf\x50\x29\x36\xea\x18\x44\xae\x88\xb9\x6c\x22\x78\x10\xd8\x07\xb8\xe5\x57\x80\x5e\x2d\x83\x48\x88\x4c\x88\x1a\xcb\x71\xbf\xa4\xe1\x94\xc1\x2e\x2d\x81\xe5\x35\x21\x86\x76\x05\x32\x5b\x90\xb6\xe6\x24\x1e\xd9\x2e\x14\xa7\x93\xca\x2a\x28\x93\x91\xaa\x89\x00\x8c\x77\x2c\x95\x41\x79\x49\x07\xf8\x37\x8e\x14\x1a\x50\x5f\x59\x02\x34\x87\x55\x01\x40\x68\x3f\xdc\xc7\x70\xf9\xf1\xdc\x3f\xb2\x47\xf6\xb9\x7d\x7a\xe4\x8c\xb8\x4c\x8e\x5b\x98\xd3\x72\x04\xed\xfe\xd1\x68\x7c\x78\xc8\xe7\x40\xdc\x0e\x4b\x51\x64\x30\xa6\x53\x09\xee\x0f\xcb\x51\x9a\x98\x5b\xad\xe1\x0e\x15\x85\xbb\x63\xdc\x0f\x70\xf7\x59\xc6\x13\x30\x6f\xce\x91\x7f\x3a\x88\x44\xe4\x95\x65\x32\xf6\xe3\xe6\x89\x46\x09\x69\x9b\xb8\x45\x03\x78\x00\xfb\x7d\x3b\x8a\xd6\xca\x80\x50\xa6\x12\xc5\x0f\xf8\x58\xe7\x59\x05\x7e\x78\xce\xd7\x0c\x4c\x60\x8b\x85\xb6\xc0\x3f\xb7\x19\x8f\x5a\xa6\x13\x67\xdc\x19\x43\x7b\x30\x70\x21\x4f\x5a\x59\xc3\x2d\x1b\x0d\xd6\x98\xff\xb2\x89\x25\x6a\xda\xd0\xf6\x06\xbc\xc0\x72\xb5\x0a\xf4\xe5\x2a\x88\x96\x48\xf1\xe8\xae\x2e\x13\x31\x66\x75\x25\x8e\x09\x8f\xa0\xeb\xf2\x19\x72\x49\x68\xce\xd0\x81\x9e\x87\x05\xe4\x65\x0d\xac\x96\x41\x34\x73\x86\x8e\x7b\x82\x27\x5d\x4c\x71\xfe\xc7\x62\x32\xfc\x3d\xea\xc6\x22\xff\xd0\x96\xc1\x9a\xc8\xc1\x12\x6c\xbf\x4c\x2b\x16\xcd\x58\x09\x8e\x9f\x89\xf4\x62\x46\x2e\xce\xfe\x19\x56\x44\x57\x4b\x2c\x32\x9e\x21\x56\xa8\x00\x12\x8b\x2d\x88\xcc\xcc\x3a\x0d\x8a\x25\x0d\x04\xf1\x74\x9e\x9e\xcc\xf1\x9a\x1b\xb9\x64\x95\xb6\x4c\x05\x59\x9d\x53\x1c\xf9\xc7\x36\xf2\x29\x6a\x6b\x6b\x60\x85\xf7\x3f\x61\xfc\x2c\x57\x69\xef\xd3\x78\x76\x5c\x98\x26\x33\x36\x11\x68\x78\xcc\xe9\x11\xb4\x11\x63\x6b\x84\xfd\xac\x45\x11\x82\xec\x2a\x8a\x12\x24\x22\x3c\xf6\x9f\x8a\x8b\xe9\xa8\x05\xd3\x33\xa0\x96\x08\x8f\x18\x40\x35\x31\xdd\x4d\x6a\x50\xed\xb4\xad\xed\xdd\x1d\xab\xdd\xd8\xee\x98\x1e\x3c\x5d\xd8\x93\xa3\x4d\x04\x65\x02\xde\xd3\x43\x09\x00\xd5\xbe\xed\xf6\xc7\xb8\xf9\xb7\xc8\x86\xd8\x9d\xc0\x3f\x7e\x88\xe3\x1f\x39\xe8\x68\xcf\x73\x90\x09\xd5\xad\xc6\xf6\xdd\xce\xbd\xfd\xce\x93\x9d\x06\x3f\x38\x20\x9b\xdd\x7f\x94\x7b\xe5\xa0\x6e\x22\xb9\xa2\xd4\xe4\xc0\xac\x2b\x85\x42\x20\x1c\x68\x11\xaa\xd8\x29\x82\x5d\xec\x3c\x36\x34\xb0\xd3\x68\x6f\x34\xb6\x3b\xd6\xdd\x86\xa1\x4f\x40\xf8\xaf\xbc\x63\x48\xb7\xea\x70\x05\x4d\xe9\x03\x92\x69\x9a\x90\xed\x66\xcb\xbc\x99\x4a\xba\xb2\x6e\xab\x02\xd6\xb6\xba\xf3\x98\x6d\x34\x92\x6d\xf0\x3b\xae\x6f\x23\x99\x9c\xbf\x38\x21\x3d\x00\x32\x9d\x70\xdb\xde\x96\x91\xb2\xae\x19\x28\x77\x13\x70\x07\x06\x7d\x2c\xb3\x0d\xe1\xec\xed\xbc\x18\x35\xd3\x14\x31\x88\x76\x04\x87\x10\x59\x07\xa1\xef\x8e\x11\x24\x1d\x35\x93\x95\x95\xcc\x4b\x2c\x56\x56\xd6\xad\x1b\x72\x8c\xf2\x4d\x5d\xd3\x14\x23\xfe\x9e\x4c\x7a\x1c\x5b\x2c\xe5\xa0\x6c\xe6\xf1\xd9\x22\xa6\x3f\x6e\xb2\xbc\xad\xc0\xb0\xf6\x02\x03\x2b\x3d\x92\xc3\x53\x07\xf5\x8f\x64\xa4\x5c\xf4\xed\x10\x4a\xa3\x33\xc9\x20\x2f\x1f\x90\x0c\xa1\xc8\x50\x86\x45\xa4\xd4\x48\x0c\x3c\x66\x20\x01\x7e\xa3\x83\x8a\xc1\xf0\x0d\xf8\x85\x80\xd6\xec\x86\x89\xa1\x4d\xd3\x44\xeb\x42\xfb\x59\x6a\x88\xce\x5d\xa8\x1e\xfa\x1e\x22\x8f\x5d\xe7\xe3\x50\x31\x92\x5d\x92\xb6\x3a\x54\xe9\x8e\x66\x74\x06\xbb\x6e\xc9\x48\x31\xc4\xce\x90\x9b\xd9\x44\xb6\x14\x10\xd4\x18\x65\x92\x35\x91\x34\x49\x99\x4c\xde\x7b\x9e\x46\x90\xaa\xfb\x63\x6f\xb0\x31\x0e\x4e\x60\x68\x0a\xad\xb1\x63\x0f\x06\x8e\x37\xac\xfb\x67\x3b\x36\x3a\x12\x63\xea\x7e\x30\x80\x41\x1c\x41\x72\xc1\xef\x77\xfc\x80\xc6\xf1\xc0\x4d\xbf\x3f\x3e\x86\xb4\x82\x62\x0e\x1b\xbe\x87\xa0\x87\xea\xfe\x59\x7e\x89\xa6\x88\x1a\xc6\x8a\xbd\x88\x4c\xf5\x8f\x91\xa5\x7a\xa6\x2d\x23\x79\x45\xc1\xcc\x15\xbf\x55\xca\x8a\x12\x2b\x4f\xd8\xc2\x88\x4e\xab\x10\x58\xc6\x05\xef\x59\xd6\x64\x82\x69\x20\x90\x75\x06\x93\xc5\xe8\x01\xef\x7d\x65\xb5\x2e\x3c\x44\x26\x64\x6c\xd7\x1f\x99\x88\xbe\x9e\x3a\x03\x74\x64\x06\xf4\xe3\x08\xe2\x65\x97\xe9\x71\x7a\x06\xb2\x45\x64\x02\xce\x90\x0e\x03\xff\x78\xc3\x75\xa0\x87\xda\xb0\x9f\x3d\x44\x49\x52\x9d\x31\x27\x52\x70\x11\x01\x88\x4b\x2d\x06\x00\xd2\x22\x01\x64\xa5\xc5\xcc\x0b\xf8\xa6\x9c\xec\x9d\xe9\x41\xc9\x72\x0e\xd5\x24\x22\xb2\xa5\x0e\x21\x22\x69\x1c\x6f\x28\x84\x2b\x24\xd9\x04\xe4\x8f\x84\x5c\x75\x0d\xca\x15\x2c\x8a\x35\xec\x56\x7a\xea\x01\x19\x77\x8f\x08\xd2\x16\xa9\x04\xec\x6a\xe9\x60\x52\xa7\x12\x3d\x95\x15\x62\x32\x39\x28\xc0\x62\xf5\xc6\xc0\x5a\x1a\xb8\x9c\x04\x4e\xa2\x2e\x0c\xed\x34\x61\xf8\xc8\xd3\x7a\x94\xd5\x02\xcf\x24\xa8\xd0\x8f\xba\x49\x72\xa6\x1f\xb6\x49\x70\x22\x1f\xb5\xbc\x4a\xdb\x45\x94\x5f\xed\xa0\x88\x66\x56\x1c\xa5\x2b\x9e\xce\xa3\x68\x17\x3d\xb1\xf2\xe9\xac\x8a\x28\x55\xf9\x62\x50\xac\x53\x02\x64\xf9\x5d\xde\xa9\xef\x81\x3f\x38\x07\xc8\xb4\xd4\x01\x83\x6c\xb8\x10\xff\xd4\xf0\xa0\xc2\x6c\x07\x09\x23\x89\x8d\x22\x89\xab\xc4\xd0\xe3\x59\xfb\x4c\x8e\x5e\xa0\x1a\xf6\x03\xdf\x75\x69\x3d\x91\xf8\xc5\x4f\x73\x09\x94\x7f\x78\x18\x42\xc4\xa1\x84\xaf\x04\x54\x9f\xf4\x49\x0e\x25\x7c\x29\x98\xf3\xcc\x2e\xfd\x1e\xa1\x56\x54\x3c\xfd\xcc\x29\x3f\x82\x13\x3f\x73\x30\x88\xe0\xc4\x4f\x45\x49\xf6\x03\x2c\xe7\x63\xee\x14\xd1\x3e\x39\x01\x25\x87\x0d\x93\x18\x20\x95\x18\x16\x34\x3e\xbb\xfa\x32\xe9\x34\x5b\xf0\x10\xb5\xc6\x08\x06\x20\xfa\x6c\x7a\x1e\xff\x6c\xe3\xe2\x85\x68\xf2\x4d\xe2\xa9\x74\xb1\xa0\xa7\xb2\x9b\x9d\x00\xe0\x1e\x80\x90\x7f\x9c\x00\x11\x82\xc4\x6c\xcb\x62\xb6\x2f\x90\x2c\x0a\x12\xab\x13\x87\x88\x59\x57\x8c\x94\x98\x11\x17\x31\x27\x31\x98\x4b\x2c\x25\x23\x9f\x60\x36\x4b\xf5\xf5\xba\x91\x2a\x40\x62\xde\xa8\x73\x39\x70\xdd\xa3\x1a\x52\x16\x16\xaf\x07\xce\x89\x33\x80\xb2\xba\x04\x16\x75\x45\x31\x78\x94\x02\xd0\xdc\xb4\x28\x95\x56\x8b\xd3\xe2\x99\x74\x6e\xda\x20\x93\x56\x0d\xe0\x09\x0c\x42\x28\xc7\xb9\xe0\x59\x78\x6e\x2e\x30\x83\x7d\x4e\x2e\x50\x01\xde\x44\x01\x0e\x9e\x45\x66\x48\x54\x39\xfa\x1b\x79\x94\x9f\xd5\x19\xb2\xad\x47\x42\x7a\x33\x66\x98\x6b\x8b\x4c\x0f\x85\x9c\x9e\x9c\xed\x7f\x24\xa4\x37\xc9\x93\x31\xf3\xa7\x05\xd4\x75\xd4\x4e\x6b\x67\x7f\xab\x71\xa7\xd3\xc3\x6c\x37\xbd\x7c\x91\x19\x1b\x27\x0b\xcb\x04\xb0\x9e\x0b\xcc\x26\x6e\x60\x47\xd0\xed\xe6\xdd\x7b\xd7\xe5\x1d\xa6\xa1\xe7\x67\xee\x13\xf0\x7a\xab\xd3\x69\xdd\x7f\xa1\xfc\xdd\x9c\x04\xf3\x8b\x18\x8b\x29\x5e\x80\x3a\x0f\xb2\xf0\xf3\x0b\x38\xc5\xc3\xf3\x94\xf6\x4e\x39\x28\xda\xca\xcd\x28\x2f\x1e\x3a\x2e\xfa\x39\xa1\xf5\xe2\x03\x1c\x1a\xe5\xc3\x82\xc3\xa2\x2b\x04\x93\xb9\x6b\x2f\x9a\x3d\x54\x7b\x34\x72\xcf\xc9\x1c\x02\x4e\x95\xda\xde\x6d\x1d\x4b\xd2\x37\xcd\x3d\x50\xc7\x0f\x1b\x3f\x42\xfc\xf0\xf1\xc3\xc5\x8f\x31\x7e\x3c\xb8\x69\xee\x29\x4c\x6f\x84\xcf\xe7\x36\xd8\x30\xa3\xb9\xda\x05\x83\x28\xc2\x07\x77\xe2\x88\x07\x8c\xf5\x5c\x88\x23\xc8\x08\x6e\x6b\x97\x97\xf5\xdb\xda\x7a\x9f\x49\x14\xb4\x83\x83\x00\xd4\x41\xdc\xb7\x14\x03\x4f\x36\x1e\x1f\xe8\x09\x50\x05\x88\xe3\x23\x9b\xe1\x0b\xcb\x65\xd1\xfc\xa7\x81\xa0\x94\x15\xc5\x84\xe8\x7a\x29\x9d\x58\xb9\x16\xd9\x17\x45\x83\x54\x27\xe6\x1f\x86\x8d\xeb\x13\x8a\xf5\x19\x32\x12\xd9\x20\x04\xc2\x10\x99\x51\x2c\x6b\x0b\x81\x56\x31\xa7\xc8\xc9\x3c\x52\x3d\x1b\x72\x71\x2d\x57\x2a\xcd\x25\xe0\xf0\xf6\xac\x24\xeb\x9a\x61\x67\x48\x0a\xc2\x0c\x19\x5f\xbc\x3e\xa5\xb4\xf0\x3c\x93\x9c\x69\x8e\x6c\xf8\xb8\xd2\xae\x58\xe9\x01\x4b\xbc\x01\x7c\xe0\x82\x24\x5b\x78\x11\xb2\x16\xe3\xc1\x97\x66\xc6\x39\xa5\x45\x24\x1e\x80\xb8\x32\xf9\x24\x8e\x40\x37\x22\x61\x38\xa7\x86\x42\xcf\xf4\x33\x74\x51\x80\x5b\x4a\x2f\x15\x5e\xaa\x8a\xb3\x28\x1d\x0d\xec\xcc\x42\x04\xa4\x66\x3c\x63\x8c\x69\xf0\x20\x33\xc8\x8b\x77\xc0\x18\x3c\x00\x09\x26\x39\x6f\xa4\x67\xc8\x1c\x8f\xfa\x4c\x09\xb3\x86\xdb\x1d\x91\x5a\xe3\x1c\xc2\x3f\x98\x43\xad\x97\x1f\xdd\xb3\x89\x34\x99\x80\x0b\xce\x31\x0c\x0d\x44\xdd\xde\xd0\x81\xd8\x36\x46\x19\x08\x85\x1b\x95\x89\x92\x50\xb8\xa5\xe2\x1d\xb0\xe9\xec\x1d\x9a\x74\x51\x10\x7e\x2c\x40\x72\x59\x29\xe9\xca\xcd\xca\x8d\x2a\x9e\x1c\x6f\x84\xa0\x6f\x06\x37\x42\xe0\x9a\x56\x11\x81\xb1\x09\x8b\x41\x8d\x49\xe3\x36\x93\xc6\x63\x0e\x26\x6e\x7a\x45\xd2\x95\x9c\xaa\x37\x18\x2b\x20\x13\x54\xea\xa7\x03\xdd\x92\x0f\x60\x26\x10\x40\x85\x89\xc0\xc2\x88\x7f\xb1\x62\x33\x99\x59\xc5\xdc\x12\xf2\x70\x01\xe3\xb8\xd8\x04\x95\x5f\xa0\x64\x37\xb7\x1a\xc5\x4c\x21\x18\x9d\x3c\xd2\x64\x4a\x26\x94\xce\xd9\x66\x9c\x8d\x40\x26\x5b\x4c\xdc\x9c\xb2\xf2\xb0\xc2\x14\x7f\xcf\xb7\x2e\xff\xd8\x8f\x55\x34\x2c\xd6\xe6\x1c\xac\xac\x07\xf1\x36\x5f\x30\xc1\xc2\xac\x5c\x25\x42\xaa\xbc\x84\x97\x1c\x48\xd6\xcb\x78\x1c\x23\xb9\x52\x21\xa2\xa8\x5c\xa9\x12\x01\x53\xae\x2c\x11\xc1\x51\xae\x2c\x63\x79\x10\xc9\x95\x15\x05\xec\xe1\xdf\x55\x05\x0c\x4d\x24\xaf\x2a\x60\x03\x7f\xae\x29\x60\x80\x33\xd5\x14\x70\x07\x67\xb7\xaa\x80\x06\xfe\x5d\x51\xc0\x21\xfe\x5d\x53\xc0\x11\xfe\xd5\x15\x70\x0f\xc3\xe9\x0a\x18\x99\x48\x2e\x6b\x0a\xd8\xc6\xdf\x65\x05\x34\xf1\x6f\x45\x01\xaf\xe1\xdf\xaa\x02\x3a\xf8\x77\x49\x01\xc7\x18\x4e\x01\x27\xf8\x47\x57\xc0\x39\xce\xa6\x4a\x5b\xfa\xc0\xec\x4a\xcd\xed\x9d\xbd\x8e\x04\xa4\x4e\xe3\x71\xc7\x6a\x37\x2c\x09\x48\xbb\x8d\xad\xc6\x46\x47\xea\x81\xdd\xeb\x76\x30\xa9\xd9\x06\x3a\x72\xc2\xda\xfb\xb8\x99\x49\xcf\x01\xf8\x1e\x26\xb2\x87\xdb\xf6\x31\x34\x21\x7f\xa3\xc1\x8e\x37\x80\x67\xa6\x47\x3f\xfa\x47\x8e\x3b\xd8\xf6\x07\x30\x34\xbb\x3d\xb6\x23\xea\x84\xa8\x89\xe0\x31\x09\x91\x3c\xa2\xeb\x2f\xd8\xe5\xa9\x21\xb2\x03\x54\x28\xc8\x11\xf0\x2e\x0e\x30\x59\x04\xa5\x5f\x68\x42\xd5\x3f\xf5\x60\xc0\xf7\xa7\xf8\xf0\x7c\xe8\xc0\x53\xb0\x6b\x62\x54\x87\xf0\x71\x8b\x6c\xcb\x80\x7d\xf6\xfd\x84\x7d\x6f\x9a\x21\x5e\x3e\x6c\xf8\xc7\xa3\x31\x82\x83\x5d\x74\xee\x42\x19\x92\x2d\x57\x05\xdc\x37\x65\x0d\xb8\x6c\xf7\xcb\x09\x47\xae\x7d\xae\xc8\x9b\xea\x80\xbd\x82\x96\x29\x05\xf6\xc0\xf1\xe9\xe1\x19\xc6\xfa\xf2\x52\xea\x1f\xc1\xfe\xd3\x03\xff\x2c\x0e\x04\x6d\x9c\xcf\x21\xdb\xc9\xf1\x43\x07\x13\x14\x67\x34\xe2\xef\x35\xe7\x90\xd6\x91\x9c\x9d\x98\x17\x07\x76\xff\xe9\x30\xc0\xcb\x4a\xa3\xb5\x7e\xa2\x92\xee\xb1\x5f\xb7\x36\x5e\xbb\xdb\x6e\xed\x6d\x6f\x1a\x58\x28\x61\x6b\xcf\x08\x52\x91\x37\xf1\x38\xa2\xd3\xa1\x98\xac\xd5\xde\x6c\xb4\x77\x71\x1a\x87\xaf\x57\x31\x88\x22\x6f\x72\xe8\xb6\x3d\x70\xc6\xa1\x21\x27\x76\x00\x42\xf5\x5e\xe7\xfe\x56\xd3\x1b\x8d\xf9\x3e\xde\xe5\x65\x02\x20\x1d\xad\x14\x0a\xad\x75\x59\x03\x27\x98\xa0\x24\xa2\x2e\xe4\xae\xc8\x50\xc1\x38\xf4\x45\x1c\x78\xd4\xa6\x02\xfa\xbe\xeb\x8b\x68\x6f\xb4\xb6\x5a\x6d\x22\x16\xd8\x11\xbf\xdd\x54\x09\x94\x02\x58\x0b\x18\xf7\xc1\xa1\xeb\xdb\x08\xe7\x3b\xa6\xf9\x6e\xec\xee\x92\x73\x28\x4c\x5e\x12\xa7\x80\x43\xdf\x23\x10\x0f\x28\xc4\x1d\xdf\x43\xa4\x44\x17\x22\x04\x83\xdd\x91\xdd\x77\xbc\x21\x06\x38\xa5\x00\x5b\x62\x38\xce\x27\x01\xa8\x00\xda\x0f\xcf\x5d\x68\xdc\x37\x4d\xd3\x55\x37\x9b\xbb\x3b\x5b\xd6\x13\x75\xab\xb9\xdb\xd9\x6f\x76\x1a\xf7\x31\x11\x86\x2c\x2f\x0e\x8b\x4b\x24\xf6\x25\x44\x95\xad\x1e\x40\xfb\x29\x2e\x72\x8f\x83\xb1\x30\x52\x5c\xf4\x01\x8e\xed\x60\xe8\x78\x18\x70\x83\x02\xde\x27\x01\x04\x7d\x1f\xe3\x83\xce\xc5\xb3\xb7\x4d\x95\x05\x2a\xc0\x3f\x81\xc1\xa1\xeb\x9f\x1a\x25\xdd\x34\xcd\x03\x3a\x12\x5b\x87\x72\x34\x40\x15\x8c\xe5\x80\xe6\xda\x62\xc0\xb8\x74\x9e\x50\x31\x06\x6a\xeb\x61\xa3\x7d\x67\xab\xf5\x48\xbd\xd7\xdc\xdc\x6c\x6c\x47\x99\x3e\x0a\xec\x11\x46\xea\x4e\x32\x39\x0e\x16\xb3\xc0\xdf\xeb\xc9\x4f\x63\x53\x3d\xf5\x83\x01\x81\x04\x23\xba\x4d\x83\x73\x6a\xf0\x6d\x4e\x12\x42\xea\xc7\x07\x87\xd1\x06\x08\x9e\xa1\x4d\xd8\xf7\x03\x9b\x04\xc8\x1a\x38\xa2\xf0\x9d\x44\x04\x49\x86\x61\x77\x8f\xec\x81\x7f\x8a\xe1\xee\xc5\x70\x34\x10\xe3\x17\x83\x50\x70\x62\x95\x72\xe8\x07\xc7\x38\xc5\x28\x4e\x11\x85\xf3\x44\x71\x00\x40\x62\x9a\x6d\x96\x46\x80\x57\xc0\x89\x13\x3a\x07\x8e\x8b\x9b\x48\xd6\x40\x93\x82\x3c\x8c\x02\x71\x9e\x31\x88\x02\x30\x59\xa2\x6e\xf1\x1a\x85\x7e\xc4\xc3\x30\x70\x04\xa0\x80\x8f\x37\x71\x6b\x62\xc0\x0e\x05\xfc\x30\x09\x50\xe4\xf6\xa2\x69\x1e\xaa\x3b\xad\xdd\x66\xa7\xd9\xda\x56\x77\x3b\x56\xa7\xb9\xb1\xbe\xa9\xb2\x04\x92\x3d\x46\xbe\xa4\x4c\x18\x73\x0e\x23\x84\xe1\x40\x56\x0a\x85\xe8\xec\x36\xaa\x9c\x29\x1d\xdb\x28\x70\xce\x64\x9d\xa8\x9e\x90\xa7\x22\x61\xc6\x98\xdb\xf1\xe9\x5c\xb4\x83\xb9\xdd\x39\x66\x02\xb8\xf7\xb7\x30\x6b\x56\x08\x77\x23\x6c\x6e\x87\x02\x3d\x36\x77\x62\xee\xcf\xc5\x17\x31\x88\xee\x6d\xe2\x54\xc2\x54\x41\xa6\x13\x62\xbf\x6b\x21\x14\x38\x07\x63\x04\x65\x26\xb3\x28\x85\x42\xce\x04\x42\xe2\xd6\xd9\xaf\xa1\x99\xa6\xf9\x78\x3d\x03\xb6\x13\x4f\x2d\xeb\xc2\xbb\xa1\x1b\x02\x42\xdd\xc7\x25\xbd\x17\x63\x51\xd4\x27\x13\xa9\x79\xff\x2e\xe3\xf2\x74\x4c\x15\x0a\x50\xb5\x07\x83\xc6\x09\xf4\x48\xdd\xa1\x07\x03\x59\x72\x7d\x7b\x20\x89\xc6\xe2\x75\xf5\x80\x1e\xae\xc9\x1a\x38\x16\x4f\xdb\x14\x19\x82\x5d\xb0\xaf\x80\xba\xda\x1f\x07\x27\x70\x50\xcf\x85\xa3\x5b\x8d\x8a\xcc\xf3\x01\x75\xd6\x6e\x94\x9b\xa7\x3e\x19\x8f\x9d\x30\x3a\x3a\xc7\xf6\x10\x9a\x5b\x54\xe8\xa2\xa6\x4c\xb4\x10\xc6\xbb\x03\x88\x1b\xde\xe6\x0c\x9c\xa2\x35\x0b\x51\xc2\xd1\xf3\xab\x40\xa7\xfc\x17\xa8\x85\x80\x03\x88\xe7\x40\x5e\x97\x4c\x08\xaf\x4e\x56\xb3\x04\x4f\xe3\xae\x33\xda\xb1\xd1\x51\x98\xa3\x59\x82\x7b\x9d\x65\x0a\xb2\xcb\xba\xf0\xae\x8a\x89\x65\xc5\x88\xf7\xf4\x05\x04\x38\x23\x5b\x34\x4d\x81\x37\x3e\x6c\xee\x36\xeb\x5b\x8d\x75\x0b\x4b\xd3\x7d\x1b\xc9\x5d\x52\xd1\x19\x9b\xd1\xac\xbe\x22\x61\x94\x9e\x62\x58\x91\x62\x8b\x13\x36\xbd\x3b\xae\x7f\x7a\x8d\x6e\x8c\x13\xb6\x7d\x9f\xcf\xbc\x78\xf0\x2e\xb2\x60\x32\x13\x38\xde\x50\x0c\xe3\x9b\xa3\xee\x39\x97\x3e\xf0\x80\x17\x8a\x24\x6c\xc9\x9d\xad\x8f\xb3\x28\x6b\x20\xc4\xf5\x43\xb6\xe3\xf1\x36\xa3\x44\x61\x53\x31\x88\xd9\xc1\x76\x6b\xbb\xa1\x14\x0a\x22\xe1\xe8\xac\x74\x5b\x4b\x84\xc6\xdc\xcf\x34\xcd\x26\xa5\x63\x73\xab\xd9\x79\xc2\x49\x2a\x20\x98\x57\x83\x6b\x28\x44\x0b\xe1\xb3\x48\x1e\x63\x4c\x60\x93\x0f\xd8\x6e\x6c\x59\x9d\xe6\x43\x11\x95\xf7\x10\x01\x21\x57\xde\x6c\x2f\x94\x27\x11\x6c\x16\x4d\x73\xac\xde\xd9\x6a\x59\x1d\x42\x71\x21\x2f\xa1\x67\xcc\x37\x98\xe4\x86\x96\x74\x0c\x08\x39\x08\x13\xc3\x8b\x99\x5c\xa6\xe6\x8d\x5c\x72\x3d\x72\xd0\x11\x9d\xa8\xae\xed\xdb\x62\x37\xe5\xdd\x98\x16\x41\x67\x32\x15\x4f\x64\x89\x21\x83\x85\xa6\x2d\x78\x02\xdd\x99\x79\xbf\x4c\x17\x6e\x6e\x6f\x35\xb7\x1b\xca\xe5\xe5\xcb\x27\xda\xaf\x6f\xb5\x36\x5e\x7b\x77\x49\xef\x6c\x35\x1e\xbf\xbb\x94\x77\xdb\xcd\xcd\x77\x97\x32\x9e\xbc\xdf\x55\xf2\x8e\x55\xdf\x6a\x28\x99\xa6\xa8\xbb\x7e\xff\x69\x2b\xa0\x1f\x1d\x7b\x1e\x6f\x79\x7f\x49\xcc\xf1\xcd\x6a\xeb\xed\x92\xd5\xe4\x96\x99\xf5\xc4\x21\x2e\x7a\xac\xd9\x6b\x4d\x75\xf7\xe1\xdd\xdd\x87\x77\xa3\xc5\x52\x22\x5d\x22\x8e\x6b\xd3\xe1\xd5\xcd\xe3\xfb\x5b\xbb\x30\x70\x6c\xd7\xf9\x38\x0c\x22\x9b\x72\x15\x0b\x0d\x4d\x3c\x55\xcb\xd2\xc0\x46\xb6\x41\xa6\xed\x9b\xe1\xc9\xb0\x78\x76\xec\x02\xa9\x08\xbd\xbe\x3f\x80\x7b\xed\x26\x5e\xb9\xfa\x1e\x9e\x04\x90\x1a\xf2\x8c\x3a\xcc\x5e\x5a\xb6\x14\x45\x99\xb0\x2d\x49\x2b\x12\xfd\xa9\x6a\x21\x96\x5e\x98\xba\xa0\x95\x57\x70\x80\x67\x29\xcc\x18\x76\x83\xfe\xe5\x65\xa0\x86\x41\x9f\x69\x1c\x6e\x58\xdb\x0f\xad\x5d\x9a\xd8\x4b\x27\xde\x20\x6e\x72\x64\x8f\xc1\x36\xef\xb4\xad\xfb\x0d\x0a\x5b\x37\x89\x9a\x90\x20\xbb\xe1\xba\x95\x04\xef\x3a\x25\xc7\x43\x30\xf0\x6c\xb7\xe4\x1c\x06\xf6\x31\x2c\x3d\x85\xe7\x12\x91\x1b\xeb\xdc\xaf\x49\x7d\x22\xf0\x9f\xf7\x7c\xef\x0d\x46\xfd\x29\x5f\x39\x49\x5b\x34\x65\xab\x00\x89\x66\xc6\xc0\xa1\xcd\x9b\x0f\x19\x6f\x1a\x5b\x37\xac\x22\xbc\x41\xd3\xf4\xfd\xd1\xf9\xc6\xee\x2e\x59\x13\xa6\x8b\x88\x37\xf5\xac\x48\x01\xb7\x86\x6e\x9b\x5a\x0d\x95\x4a\x7c\x5f\xcf\x52\x1d\x04\x8f\x65\xa4\xd4\xa4\x3e\xd5\x46\x92\x16\x4d\x33\xc0\xa2\x27\xed\xfa\x21\x44\x51\x45\x03\x40\x08\xce\xbf\xe9\xe1\x68\xa0\x44\xd2\x13\xc4\x28\xed\xde\xb7\xb6\xb6\xf6\x9b\xf7\xad\xbb\x0d\x53\xec\x6c\x43\xe7\xb0\x76\x60\x87\x70\xb9\x0a\xda\x9a\x7b\xb7\xb5\xe9\x1e\x59\x0f\xac\xba\xd5\xb4\xe8\x7f\x3b\x37\x6f\xde\x3c\xbf\xb7\x54\xb7\x1a\xe4\x73\x8b\x86\xd6\x2d\xf2\xdd\xac\xb7\x2d\x6b\x45\x7a\x55\x5a\x9d\xd1\xae\x07\xe9\xaa\x66\x26\x38\xa1\xd1\x19\x85\xb6\xe1\x08\xda\x28\xa3\xf1\x19\xc5\xf3\x69\x27\x37\x76\xc8\x63\x1d\x6f\x68\x05\xd0\x9e\x01\x64\x3b\x1e\xca\x81\xb8\x1b\xd8\x03\x07\x7a\x28\x2e\x2c\xad\x36\x9a\x89\x89\xf7\x7b\xf6\x5b\xed\xe6\xdd\xe6\x76\x32\x6c\x63\xab\xb9\x93\x0c\xd9\x6d\x7e\xb8\x91\x0c\x69\x37\x76\x1a\x56\x27\xa9\x59\xea\xc8\x48\xd6\x88\xd2\x13\x7e\xd3\x89\xba\x25\x7e\xab\xe0\x57\x9b\xbc\xae\x28\x44\x57\x40\x2e\xd3\xed\x55\x7d\x45\xd0\xc3\x74\x5e\x4a\x0f\xb3\x9f\x8b\xcf\x05\xfd\x35\x34\xb0\xdd\x62\x61\x86\x0e\xe8\xcb\xfe\x63\xa3\xcc\x5f\x9f\x18\x95\x09\x70\x73\x2a\x79\x61\xed\x75\x5a\x86\x06\x36\x5a\xdb\x1d\xab\xb9\x6d\xe8\x60\x03\xcb\xe3\x46\x19\x50\xa5\x7b\x9c\x6e\x9c\x43\xae\x0b\xba\x19\xb6\x5f\x6f\x11\x75\x7c\x6b\x73\xb3\xb9\x7d\x97\x7c\xe9\x24\xaf\xc6\x76\x87\x7c\x95\x27\xe0\x41\x6e\x0b\x8c\x05\xe7\x20\x54\x2f\x9a\x31\xd7\xf7\x65\xe3\x95\x73\x6e\xc6\xa2\x24\xaa\xb3\x1e\xe2\xee\xe2\xaa\x8c\x16\xb5\x83\x00\xda\x4f\x6b\x0c\xee\x04\x06\x69\xa8\x87\x8d\xb6\x08\x43\xb6\x04\x12\x20\x98\xb6\x0c\x82\xb7\xa6\xa0\xde\x9f\x3c\x01\x81\x78\xea\xdf\x4b\xaa\xfb\x24\xfb\x71\xbe\x42\x8c\x06\x3c\x53\x03\xb6\x69\x91\x42\x31\x7f\xb7\xbb\x5a\x8f\x62\x60\xc6\x95\xb9\xbc\x4c\x07\x3f\x6c\xb4\xf9\xb1\x1c\xa2\x47\xa9\x37\x11\x3b\x0e\x04\xbe\xc9\x34\x5b\x6f\x72\xcd\x56\x3e\x33\x85\xb7\xfc\x45\x33\x53\x04\xce\x6b\x3d\x79\x38\xc4\xf2\x04\x3c\x6f\x9f\x9e\x4c\x8a\x00\x34\xe7\x1b\x3e\x40\x91\xfa\x2c\x2b\xc5\x8e\x94\x3f\x0b\x05\x39\x30\xe3\xcf\xac\x82\x0a\xcb\x1f\x8f\xb8\x04\x52\x98\xf6\x85\x82\x4d\x3c\x0b\x89\x61\xeb\x98\x27\xd1\xe2\x8c\xdc\xd8\xe0\x26\xab\xfb\x8d\x24\x1c\x47\xc7\x33\xe3\xcf\x3c\x74\x58\x55\xf2\xf1\x91\x03\xd3\x8b\x68\x7a\x03\x72\x55\x99\x24\x65\xb8\xbe\xe2\x75\x2c\x2f\xcf\x2f\x19\xed\x06\x20\x30\x51\x44\xb3\x75\x34\x87\x7c\x1c\x05\x83\xab\x32\x7b\x26\x8a\xaa\xb7\x8e\xe6\xd4\x34\xd2\x79\x36\x84\xa2\x02\x23\xdd\x61\xf2\xaa\x86\xc3\x4e\x65\xb6\x87\xa6\x80\x61\x7e\xaf\x4f\xce\x00\x73\x35\x35\xc7\xaa\xc0\x8e\x44\x61\x38\x57\x73\x4e\x91\x2d\x76\xd8\x39\x56\x45\xce\x95\x3c\xec\x4c\x66\x90\xde\x7b\xb0\xf0\x70\x7d\xa1\xc9\x6d\x96\xb2\xe3\xac\xfc\x15\xb2\xa1\xc4\x4f\xbf\x2d\x56\xc3\x07\xd9\x1a\x2e\xc0\x1a\x8b\x12\x19\x2e\x3b\xc3\xea\xfa\x51\xd5\x76\x9b\x9b\x8d\x5d\x95\xa8\x78\xcd\x6e\x7f\xa2\xff\x96\x4e\x43\x15\xcf\xe6\x24\x72\x72\x12\x75\x5a\x3b\xf3\x92\xf4\x73\x92\xd0\x13\xe7\x39\xa9\x12\x3a\xbd\xcc\x1c\x41\xf6\xa8\x6a\x43\x1d\x78\x44\x97\xc1\x01\x1e\xd3\x08\xa9\x97\x6c\xe0\x71\xcd\x06\xa7\xc4\x64\xed\x85\x07\x73\x1a\x7b\xc1\x9b\xd1\x9c\xb1\x24\x33\x43\x7f\x3f\x79\xae\x62\xe5\x2a\xdd\x21\xae\xaa\xc2\x89\x60\xe5\xea\xda\xa1\x48\x1b\x23\x62\x22\x33\x90\x12\xc4\xaf\x8c\xb2\x85\x17\x8d\x0e\x4b\x0d\x08\x1c\xeb\x42\x7d\x35\x92\x0b\x98\xee\x66\x12\x77\x22\x66\x93\xec\x19\x69\x99\xea\x0e\x0d\x0a\xa8\xfe\x92\x7a\xae\x50\x76\x35\x27\x5d\xd1\xe3\xf5\x7c\x0f\xd3\x73\xe2\x14\x5f\x22\xa3\x6b\x33\xe8\xd5\x92\x94\x79\x72\x2d\x65\x02\xa6\x4f\xa3\x9e\x25\x32\x27\x5d\x70\x1e\x42\x71\xba\x22\xca\xa9\xdd\x1f\x9e\x9e\x55\xee\x25\x32\x9a\x9b\x41\x44\x99\x58\xae\x7c\x97\xa4\x79\xa1\xf6\xba\xa6\x7a\xef\x69\x1e\x45\x61\x8e\x7e\xd7\x95\x11\x32\xe9\xa5\x8c\xf1\x5e\x6a\x58\x5d\xdb\x5e\x73\x86\xc4\x1f\x96\xf6\x45\x3b\x4c\x2e\xd2\xa9\xce\x32\x99\x64\xd7\x93\xb9\x6b\x79\xe1\x3c\x7e\x83\x1c\x53\xe3\x62\x03\x41\x5b\x2d\x15\xaf\x80\x83\xe4\x02\xd5\x18\x50\x1d\x2b\x01\xce\x75\x46\xc6\x30\x99\xd4\x75\x46\x22\x48\x2b\x70\x86\x8e\x67\x6c\x24\x80\x68\x60\xd2\x1c\x21\x66\x9d\xdc\x68\x94\x4e\xcb\xa5\x03\xff\x2c\xb2\x1a\x4d\x08\x0d\xb5\x68\x19\x01\x3d\x94\x02\x13\xa6\xe5\x49\x14\x18\x4f\xe3\x13\x05\x6c\x98\x2f\x59\xf6\x83\x17\x2b\xfb\x41\x5e\xd9\xa2\x08\x31\x01\xe9\xf6\xa1\xe2\xe3\x61\x82\x44\x84\xe2\x8a\x7a\x6c\x8f\x64\x11\x4f\xe7\x50\x96\xc6\x81\x2b\x99\xa6\x69\xa9\xc7\x10\x1d\xf9\x83\xd8\xaa\x35\xde\xf5\xb2\x54\x3b\x18\x86\x5d\xad\xa7\xd4\xe8\xab\x89\xd6\xbb\xa8\x67\x74\x7b\x93\xc8\x03\xb1\x02\x02\x53\x2c\x91\xcf\xb6\x6a\x38\x72\x1d\x24\x4b\x40\xc2\xcb\x6b\x11\x82\x4e\x7d\x62\x7c\x3d\x11\x8f\x25\x63\x21\x36\x76\x71\x9c\xac\x45\x5c\x65\xb9\xde\x85\xbd\xcb\x4b\x26\x8d\xaa\x28\x70\x8e\x65\x85\xe7\xb0\x20\xd1\xea\xdf\xa1\x9a\x54\x2f\x00\xd9\xe0\x45\x5e\x84\xfe\x38\xe8\x43\xc3\x02\x74\x16\x36\xf2\x9a\x9a\x65\xc2\x5a\xdc\xf3\x4b\x14\x36\x6a\x48\x81\xff\xd6\x98\x65\x32\x8e\x2f\x9d\x45\x86\xca\xf8\x73\x21\x2f\x21\x9f\xec\x13\xe9\xce\x59\xba\x28\xc1\xc2\xac\x74\x4f\xc4\x74\x99\xe8\x49\xfa\x5b\x96\xa8\xf3\xd6\xf8\x2c\xd8\xeb\xc2\xde\x3a\x7e\x18\x1e\xee\x03\x00\xaf\x4b\x0c\xee\xce\xf8\x56\x79\xbd\x8b\x97\x0d\x60\xaf\x67\xd0\x17\xbc\xd4\xe8\xc5\xaa\x0a\xb6\x00\x88\x17\x52\x64\x35\xd5\x33\xf8\xbb\xde\xeb\x4d\x26\xca\x04\xdc\xc9\x31\x49\xa1\xed\x83\x3b\xe7\xfa\x9e\x41\x97\x1a\x96\x32\x01\x8d\x79\x63\x8d\x2a\xec\x72\xa2\x62\xde\x96\x30\x12\x8f\x97\xe9\x92\xae\x69\x1f\x90\xd8\x8e\x2c\x66\x8c\x2c\x0d\xf2\x47\xb3\x52\xc4\xf0\x74\x87\x60\x06\x94\x14\x9f\xc4\x26\x55\x23\x95\x09\x38\xcc\xee\xcb\xd1\xed\xba\xac\xf1\xe0\xcd\x8f\xbc\x1e\xfe\xc9\x4d\xc0\x3c\x54\x77\x7b\xc0\x33\x25\x09\xd4\x4d\xa2\x31\x63\xe3\xf7\xd0\xd4\x80\x6f\x6a\xc0\x31\x33\x67\xba\x92\x54\x23\xce\xa1\x2f\x3e\x28\x7d\x90\xf8\x0b\x60\x6e\x0c\x34\xa0\x2b\x85\x82\x6c\xc7\x21\x3a\xe0\x2d\x54\x2a\xe3\xb5\x6e\xa1\x10\x70\xef\xd5\xac\x4b\xd7\x28\x3e\x5e\xa4\x30\x23\x95\x24\xa0\x2b\x45\xbd\x26\x95\x70\xeb\x78\xc9\xcc\xe1\x6d\xad\x50\x90\x2d\x31\x18\x2a\x49\x47\xb1\xc0\x8b\x63\xa1\xa2\x00\xc9\xf3\x3d\x28\x2d\x9a\xa6\x8c\x23\x12\xa0\x4a\xa1\xc0\xbc\x69\x5f\x8c\x02\x78\xe8\x9c\x19\x16\xa0\x9c\xca\xf0\x00\xe6\x45\xc4\xaf\x3a\xa3\x0f\xa6\x4a\xec\x11\x9e\x0f\x68\x49\x51\x0f\xfd\xa0\x61\x27\xb6\xa4\x08\xf3\xd3\x16\x4d\x33\xbc\xbc\x5c\x84\x2a\x82\x21\x71\x14\x9e\xea\x4e\x1f\x94\x3e\x68\xd4\xd7\xeb\xb8\x0b\x16\x0a\x32\xa5\xbd\x62\xd4\x4d\x4b\xdc\x2e\x92\x25\x83\x6c\xc6\xd3\x20\x9c\xad\x69\x9a\x21\xdf\x9b\x3f\xf1\x9d\x81\x1c\x9a\xba\x52\xf3\x8b\x45\x31\x99\x92\x4e\xa6\x93\x64\x17\x2c\x03\x9f\x67\x80\x5b\x99\xec\x56\x3a\xb2\x52\xf3\x4b\xa5\x89\x90\x07\xb8\xb6\x68\x92\x8a\x67\x5e\x28\x90\x9c\x0b\x85\x45\x8f\xf9\x23\xbe\xf9\x91\x71\xe0\xfe\xc9\x4d\x27\x72\x91\x9e\x6e\x7c\x52\xb4\x8c\x09\xab\x4c\x48\xe6\xeb\x5e\xd1\xb4\x0c\xbb\x68\x5a\x93\x89\x02\x1c\x59\x01\xe8\x15\x9c\x38\xec\x58\x9d\x7b\xe6\xc5\xc3\xc6\x46\xa7\xd5\x36\x34\x50\x6f\x7c\xb8\xd9\x68\xef\x6f\xec\xb5\x1f\x36\x0c\x1d\x6c\x34\xdb\x1b\x5b\x0d\xa3\xfc\x6a\xd4\x8c\x4d\x24\x2f\x8b\xa7\x60\x49\x05\xd3\xf7\xdf\x13\x49\x40\xa8\xa1\x52\x62\xd0\xf0\x33\x6e\x33\x7f\x6e\xbe\xe7\xd4\xe7\x02\x60\xa4\xa7\x67\xa6\x03\x70\x95\x4c\x48\x75\x9c\x76\x3b\x4f\xb6\x1a\xd4\xa1\x4b\x22\x84\x1f\xeb\x27\x37\xda\x89\x5e\xb2\x37\x03\xf2\xa2\xb9\xbd\xdb\xdc\x6c\x18\x1a\x68\xed\x75\xc8\x9b\x3e\x01\xf5\x9c\x82\x2e\xb6\x5b\xdb\x0d\xa3\xa4\x83\xcd\xe6\xee\x86\xa1\xf1\xee\xa0\x83\xdd\x07\x7b\x56\xbb\x61\x94\xc1\x66\x63\xa3\x79\xdf\xda\x32\x2a\x60\xe3\x43\xaf\xed\xf3\xaf\x2a\x0f\xdf\xdf\x6a\x58\x44\xf6\xfa\x70\xa3\xdd\x32\x96\xc0\x56\xeb\x51\xa3\xbd\xdf\x6e\xdd\xb7\xb6\x8d\x65\xb0\xb7\xb3\x13\x7d\xad\xb0\xb8\xbb\xed\x46\xe3\x35\x63\x95\x7d\x59\x5b\x3b\xf7\x2c\x63\x8d\x41\xd2\x2f\x5d\x03\x56\xdb\xaa\x37\x37\xf6\x9b\xdb\x9b\xcd\x0d\x43\xd7\x81\xd5\xbe\xdf\xd8\x6e\x5a\xdb\x86\x5e\x06\xf5\xc6\xf6\x5d\x6b\xab\x69\xe8\x15\xb0\x61\xdd\xaf\xb7\x36\x49\x78\x95\xe0\xd7\xb0\xda\x9d\x7b\x5b\x4f\xf6\xeb\x6d\x6b\x7b\xe3\x9e\xa1\x2f\x91\xd0\x7b\x0d\xeb\x61\x63\x7b\xeb\xc9\xfe\x6e\xa7\x71\xdf\xd0\x97\x49\x60\x73\xb3\xd1\xba\xdb\xb6\x76\xee\xe1\x12\x56\xc0\x66\xe3\xa1\xb5\x6d\xdd\xb5\xda\x4d\x43\x5f\x05\x8d\xce\xbd\x66\x6b\xa7\xb9\xb1\xbf\xbd\x77\xbf\xd1\xc6\x10\x6b\xe0\x6e\xa3\xd5\xbe\x8b\xcb\x2a\x6b\xe0\xee\xde\x87\xac\xb6\xd5\x69\x1a\x65\x1d\xdc\xdd\x6b\xdf\xdf\x7b\xed\x5e\xd3\x28\x97\xc1\xbd\x46\xbd\xdd\x78\x44\xde\x9a\x6d\xeb\xae\xb5\x6d\x19\xe5\x4a\xf4\xbe\xdf\x6c\xb7\xee\x59\x46\xb9\x0a\x3e\x64\xed\x58\xdb\x8d\xdd\xc6\xfe\x9d\x56\x1b\xd3\xb3\xbc\x14\x07\x35\xb7\x79\xe0\x32\x78\xcd\xda\xde\xb6\x36\x2d\xa3\xbc\x02\x5e\xb3\x3a\xd6\x6b\x24\xc3\xd5\xe8\x9d\x67\xb8\x06\x5e\xbb\x77\xbf\xd1\x36\x2a\x1a\x78\xad\xd5\x6e\x58\xdb\xfb\xf7\xac\xed\xbb\x7b\x5b\x3c\xfb\x8a\x2e\x84\x7f\xc8\x8a\x82\xcb\xc9\xe0\xa8\xe4\x4a\x05\x6c\x59\x2d\xa3\x52\xe5\xad\xc4\xc9\x5f\x59\x02\xf7\xad\x2d\xeb\x89\xb5\x65\xdd\x37\x2a\xcb\xe0\x7e\x6b\xfb\x6e\x6b\x8b\xc4\xac\x80\xfb\x4f\xac\xed\xfb\x56\xdb\xa8\xac\x82\x56\xbb\xf9\xc4\x32\x2a\x6b\x60\xa7\xd1\xde\xc5\xd1\x55\x0d\xec\x36\xef\xef\xec\x6f\xdc\x6b\x8a\xf5\xae\xea\xc9\xe0\x08\x83\x6a\x19\x74\xac\xfb\xcd\x2d\xa3\x5a\x01\x9d\xc6\xd6\xde\xdd\x3d\xa3\x5a\x05\x9d\x7b\x56\xd3\xa8\x2e\x81\x4e\xb3\xde\xe8\xe0\x5c\x97\x41\xa7\x6d\x6d\x66\x72\x5d\x49\x06\xc7\xb9\xae\xf2\x8e\xc6\x2b\x54\x5d\x23\x5d\x7f\xab\xb5\xbb\xd7\x6e\xec\xb7\x76\x1a\xdb\xc6\x92\x26\x06\xe1\xdf\xc6\xa6\xb1\xa4\x4f\x80\x9d\x3f\x7c\xe7\x88\x50\x03\x27\xec\x47\xc2\x4d\x5d\xc5\xd9\xb2\x05\x8a\x13\xf4\x5d\x28\x44\xd1\x81\x47\x23\xc3\x8f\x8d\xed\x40\x8c\xa4\x83\x91\x46\x0e\x60\xdf\x39\xb6\x5d\x31\x57\x3a\x12\x59\xc6\x1f\x7d\x5a\xca\x82\x08\x43\x37\x91\x4b\xc9\x85\x36\x59\x4f\x7d\x1c\x06\x7e\x36\xcb\xc4\xe0\x66\xe2\x1d\x96\x27\x4a\x81\x7f\x6c\x7b\x02\xbc\x30\xea\x29\xd8\x78\x34\xca\x01\x13\xd8\x81\x98\xdb\x30\x80\xf0\x69\x26\x37\xc2\x27\x44\x30\x72\xd9\x50\x06\x8c\xb0\x0c\xb1\xd0\x34\x98\xc0\x59\x98\xc4\x19\xd8\x07\x4e\xbf\xe4\x78\x03\x47\x6c\x1c\x91\xe5\x70\xc0\x63\xe8\x39\x89\x1a\xf0\x7e\x43\x01\x0e\xa0\x37\xb4\x5d\x47\x88\x67\xbc\x89\xb5\x85\x7d\x7c\xe0\x0f\x92\x19\x44\x1c\x2b\x6e\x2e\x68\x07\xe8\xc8\x3d\x2f\x1d\x04\xb6\xd7\x3f\x4a\xb5\x5a\x92\xa1\xc5\x89\x8e\xa0\x7d\x02\x3d\xf7\xbc\x14\x22\x78\x9c\x4a\x93\x60\x77\x71\x12\x67\x00\xfd\x61\x60\x8f\x8e\x12\xd5\x4e\xb1\x42\xde\x3d\x4e\x6c\xcf\x1e\xda\x81\x93\xe8\x14\x9c\x43\x32\xcf\x50\xe8\xc8\xf1\x47\x4e\xbf\x44\xec\x7e\x12\x99\xa6\xd9\x27\x4d\x30\x84\x7e\x30\x4c\x92\x83\xf3\x54\x06\x30\xfe\xa8\x1d\xd8\x48\x2c\x94\x33\x5a\x0e\x10\x1c\x8f\x9f\x1e\x25\x01\x28\xf7\xa5\x00\x47\xf0\x20\x80\xa7\x42\x34\x65\xc8\x2c\xd2\x09\xec\xa1\xed\x89\x9d\x83\x73\xe6\x24\x40\xc9\x09\xfc\xa3\x3c\x30\xca\x6f\x29\xf0\x47\xed\x91\xed\xc1\x10\x96\x88\x46\xab\x38\xda\x52\xcc\x3d\x05\xee\x78\xb3\x13\x70\x46\x45\x93\x3c\xb5\x3d\xcf\x1e\x88\x78\xb0\xe9\x80\x47\x23\xfb\x69\xb2\x3a\x7c\x5e\x48\x02\x64\xaa\x93\x9c\x3e\x18\xf0\xd1\x31\x0c\x44\x18\x3c\xa1\xb0\x28\x3f\x80\xb6\x57\x3a\xb2\xbd\xe1\xd8\xcd\x56\x37\x6f\xc6\x49\x27\xfc\xa8\x3d\x2f\x5d\x34\x23\xe5\x24\xcb\x21\x57\xee\x9c\xc5\x38\x85\x2d\xb2\xb1\x2d\x2b\xc1\xb5\x72\xc6\x73\x72\x7a\xa3\xc0\xc7\xb6\x6b\x9f\xdb\xae\x2d\x0e\xab\x68\xd2\x63\x20\xbe\x37\xf4\xdd\x64\x56\xd1\x54\xc8\x40\xce\x6d\xef\xd8\x16\x29\xca\xa6\x47\x1a\xed\x07\xce\xb9\xd8\x24\x64\xc2\xa4\x51\x23\x18\x84\xc9\xac\xd9\x24\xca\x66\x07\xe7\x78\x54\xea\x1f\x39\xf9\x7d\x2f\x67\x92\xcd\x49\x96\x43\xd4\xdc\x69\x98\x26\x45\xf6\xb1\x23\x82\x92\x89\x99\x45\x41\x77\x3c\x1c\x8b\x71\x64\xae\x66\x91\x47\xb6\x38\x52\xf1\xe4\xcd\x22\x9c\x03\x88\x12\x35\x64\x13\x3a\x8b\x0e\xec\xc1\xec\x1a\xe6\x4c\xf8\x39\xc9\x72\x6a\x98\x2b\x12\x24\x66\x8e\x6c\xff\x48\x4a\x0b\xb5\x68\x52\x77\xfd\x70\x1c\xc0\x92\x3f\x82\x5e\x6a\x7e\x17\x24\x89\x0c\x38\xfe\x85\x83\xfc\x04\x54\xce\xa8\xb1\x9d\x28\x0f\x4a\xe9\xd3\xb8\x3a\x57\xc4\x0d\x23\x2f\x5a\xf1\xba\x22\xbb\xe7\x21\x6b\x20\xc8\xdd\x1f\x51\xe4\x1c\xad\x2d\xc9\x75\x42\x54\x22\x2a\x5e\x25\xa2\x9f\x25\x45\x4e\x83\x2e\x5c\x51\xda\x31\xec\xeb\x92\xe3\x85\x96\xa4\x08\x86\x4c\x74\x8f\x9a\x5b\x91\xae\xc3\xae\xd6\xe3\xb6\x4a\x0c\x82\xef\x70\x1a\xe1\x75\x99\xf3\xbd\x30\x49\xb9\x66\x93\xda\xf1\x42\x67\x10\xcb\x50\x9e\x4a\x57\x44\x6c\xf0\x8d\x11\x8d\x4d\x1f\x78\xaa\x6c\xb9\x44\xf6\xd1\x5e\xf1\xd5\x6c\x7f\x2c\x46\xb7\x1e\x33\x62\xad\xe3\xdf\xb2\xc2\x1c\x98\xce\xb1\x3a\x7d\x7f\xb7\x05\xe0\x59\xe4\x35\x2f\x69\x74\xca\x0c\x57\x82\x79\xbe\xf2\x3a\xf0\x0c\x6d\xfb\x83\x1c\x17\x9e\xb1\x32\x92\x2f\x43\x75\x60\x23\x1b\x20\xae\xc7\x9e\xb0\xf5\x12\x8f\xf1\x2d\x39\x00\x08\xc8\x1a\xa8\xc7\x66\x62\xdc\xf0\x05\xc7\x10\x7b\xf0\xac\x6e\xb1\xcd\x2c\x55\x6f\xca\x1f\xb9\x7c\x3d\xbc\x34\x2e\x4b\x97\xaf\xcb\x97\xaf\x2b\x8a\xdc\xb5\x4b\x1f\xef\x29\x37\x87\x20\x7d\x77\x61\x4a\x57\xc4\x53\x3b\x8d\xc7\x9d\x7d\xe2\x15\x18\xf3\x45\x3a\x2f\x6e\x58\xbb\x0d\x23\xda\x02\x4c\xec\x25\xd6\xf2\x93\x6d\x58\x3b\xcd\x8e\xb5\xd5\xfc\xb0\x90\x2e\x80\x23\xd7\xee\x43\x39\x04\xce\xac\x64\x84\xcb\xa6\x4b\xdb\xc3\x3c\x99\x95\x96\x1a\xa7\xd6\x64\x92\x50\x19\x4c\x28\x1f\x44\xd7\x6e\x69\xeb\xb0\x88\x92\x19\x11\x4b\x98\x57\xb3\xcf\x55\xae\x24\xee\xf5\xb3\x12\x17\x4e\x59\x5d\xad\x57\x28\x94\x97\x96\xc8\xbb\xde\xa3\xbb\x87\x56\xb7\x2c\x84\x56\x7a\x13\x50\x37\x2f\x86\x10\x2d\xec\xee\xed\xec\xb4\xda\x9d\xfd\xb6\xb5\x7d\xb7\xb1\x5f\x6f\xed\x6d\x6f\xee\x46\xfb\xd1\xa9\x8d\x57\x4b\xa5\x5e\x64\xdb\xb6\x37\x84\xb1\xb7\x3c\x21\x90\xee\x5a\xc2\x7c\x17\x8a\xb1\x8e\x14\x4d\xc1\x6d\x7e\x24\xd2\xfd\x11\x0c\x91\xa4\xd4\x78\xcf\x65\xee\x23\x25\xbd\x5c\x19\x9d\x49\x51\x87\x66\xea\xf0\xa6\x74\xe0\xfa\xfd\xa7\x12\xa0\xbe\xfa\x54\x7b\x34\x82\xde\x60\xe3\xc8\x71\x07\x32\x52\x00\x54\x43\xe8\xc2\x3e\x19\x2f\x32\xe2\x84\x9b\x81\x96\x1c\xb9\xcd\xe3\x67\xcc\xdc\x27\x12\xa9\x32\xc9\x3f\x80\xc7\xfe\x09\x8c\xf2\xd7\xcb\x15\xd3\x34\x3d\xb6\xfb\xba\xa8\x71\xde\xb5\xa8\x4f\x64\xee\x32\x30\x1a\x6d\xf9\xcd\x5c\x07\x52\x1e\xe9\xa3\x06\xb7\x26\x78\xec\x01\xb1\x89\x76\x1f\xde\xdd\xdf\x6c\x5b\x8f\x9a\xdb\x77\x73\x5b\x88\x6d\xf8\xc3\xd3\x05\x32\x0d\x82\x1c\x4a\x53\xdd\x74\x49\x01\x81\x49\x2d\xc5\x7c\x0f\xb3\x08\x59\x2a\x0f\x24\x3c\xcc\xc3\xa0\x6f\xe6\xa9\xe9\xdf\x0a\x4f\x86\x0b\x67\xc7\xae\x17\x9a\x1f\x3c\x42\x68\x64\xdc\xbc\x79\x7a\x7a\xaa\x9e\x56\x54\x3f\x18\xde\x2c\x6b\x9a\x86\x41\x3f\x78\xfb\x16\xfe\xb9\x2d\x91\x8b\x38\x03\x75\x10\xd8\xa7\xf4\x2c\x12\x12\x7b\x4b\x80\x87\xc8\xa6\x8d\xec\xbd\xf6\x96\xac\xc4\xd7\x68\x46\xc4\x8b\xe8\xf9\x2e\xa8\x28\x50\x67\x1e\x11\xeb\xd6\x6e\x63\xb9\x2a\xd0\x31\x3d\xeb\x44\x84\xcc\x3b\xac\x8c\x89\x1b\xcc\x21\xae\x67\x06\x59\xe2\x0a\xbc\x77\x27\xf0\x8f\x9d\x10\x26\xce\x35\x10\xa1\x3d\x64\x57\x57\x0a\x53\x16\x26\xa5\x27\x90\x12\x51\x52\x06\x39\xa4\x8c\x55\xf6\x2d\x79\x51\x8f\xce\xb3\x2c\x79\x51\x53\x26\x35\xa4\xfa\x9e\xeb\xdb\x03\xb3\x0e\xf0\x2b\xc4\xd3\x58\xce\xfd\xad\x34\x29\x58\x24\x97\xd7\xa9\x7d\xff\x78\xe4\x42\x04\x0b\x85\x10\xa2\x8e\x73\x0c\xfd\x31\x92\x45\x0b\x50\x59\x99\x80\x25\x4d\x53\x26\x4a\xdc\x68\xc0\x7a\xf1\x66\x4b\xb6\x47\xd4\x72\x59\xbc\xe0\x64\x42\xa6\xf9\x44\x6b\xde\x69\xb5\x1b\xcd\xbb\xdb\xad\xfa\x87\x1a\x1b\x9d\xcc\xe0\xc8\xb9\x52\x99\xde\x2a\x88\xe7\xd3\x42\x21\x27\xfa\xd4\xf1\x06\xfe\xa9\x7a\x08\x51\xff\x68\x3d\xcf\x33\xe8\x8c\x26\xaf\x31\xd5\x32\x53\xd7\xb4\xc8\x1b\x2d\xfe\xa8\xf1\x73\xf9\x4c\x7f\x40\xea\xa1\xe3\xba\x54\xa4\x26\xb7\xf4\x69\x60\xa1\xbc\xb4\x04\x16\x34\x05\xb3\x3b\x1c\x49\xb8\x13\x31\x57\xd6\xc8\x1f\xbf\xd8\x34\xee\x85\xb6\x09\xc5\x7e\x50\xab\x93\x5e\xc4\x27\x69\x22\x97\x53\x8c\xef\xf8\x01\x74\x86\x1e\x6d\x8e\xdd\x87\x77\x15\x99\xe5\x49\xcc\xa1\xeb\xc2\x39\xbd\x88\x15\x1c\xcc\x44\x05\x90\xcc\x71\x7f\x8a\x8c\x7e\x06\x24\xdf\x50\x51\xd1\x11\xf4\x64\xd1\xc5\x38\xca\xb0\x02\x56\x13\xc2\x84\x48\x38\xae\x43\xa2\x00\x22\xc8\xd4\x5e\x18\x1f\x56\xe5\x4c\x0b\x0d\x9c\x93\x78\xf0\x45\x06\xb8\xa9\x63\x5c\x69\x1c\xb8\xb2\x54\x24\x57\x26\x82\x30\x3d\x03\x69\x1a\x9e\x81\x3c\xb9\x4e\x3c\x0d\xe4\x56\xfa\x85\x29\x1d\x2a\x8a\xc1\x86\xbf\x1a\x40\x72\xd1\x31\x1e\x6e\x69\x9a\x09\x3e\xdf\x05\xd2\x59\x74\xe8\x7b\xf2\x75\x64\xc3\x19\x52\x96\x90\xcd\x71\x51\x17\x87\xaa\x88\x4d\xe8\xbb\x27\x10\xa3\xf3\xc2\x83\x37\x77\xf8\xcd\xe3\xbe\x1b\xad\xf6\x2e\x35\xd0\x89\x85\x0c\x7a\xd4\x44\x8e\x91\x79\xbf\x56\xd4\x7e\xe0\x87\x21\x55\x11\x7a\x61\x6c\x84\xcc\xe7\xe1\xd0\x6e\xec\xee\xb4\xb6\x77\xe9\xa9\x54\xcc\x2b\x52\xfa\x13\x32\x33\x69\xbb\x87\xd0\xa8\x0d\x3f\x36\x86\x21\x52\x30\x8d\x46\xbe\x17\x92\xd5\xe9\x8b\x4f\xef\x62\x79\xd7\x12\xe7\xf1\xbd\x76\x8c\xd3\xa9\x83\x8e\x36\x02\x38\x80\x1e\x72\x6c\x37\xc4\x2b\xab\x2c\x5a\x2f\x47\x9f\xc7\xf7\xda\x29\x1c\x26\x82\x78\x5f\x7f\x45\xa7\x92\x49\xf7\x16\x26\xa4\x52\xf9\x66\x63\xa3\xd5\xb6\x3a\xcd\xd6\xf6\xfe\x56\x73\xbb\x91\x0d\xce\x01\x24\x07\x8a\xe9\x6b\x3b\x88\xab\xa5\xba\x29\x07\xa6\x37\xd7\xd5\x52\x74\xa3\x45\x7e\xae\x17\xbb\xad\xad\xe6\xa6\xa1\x81\xcd\xd6\x5e\x9d\x1c\x4d\x6e\xb6\x3a\x9d\xc6\xa6\x51\x06\x9b\xd6\xee\xbd\xc6\xa6\x51\x01\x8f\xac\x87\x4f\x8c\xea\x04\x84\x39\xd8\xd2\x13\x4e\x62\xcd\x47\x4c\x38\x72\x2b\x79\xb1\xb7\xbd\xd9\x68\xe3\x57\x43\x07\xad\x87\xec\xb5\x0c\xa8\x51\xe7\xbd\x76\x6b\xef\xee\x3d\xa3\x02\xea\x5b\xcd\xed\xd7\x70\x41\xce\xbc\x43\x9f\xb1\x37\x80\x81\xeb\x78\xf1\xee\x83\xaf\x46\xf9\xb3\x0d\x88\x93\x0c\x04\x2f\x95\x6d\x58\x3a\x1e\x2c\xe1\x25\xee\x78\x78\x24\x00\x89\xf8\x4c\xa2\x50\x82\x16\xee\x31\x79\xcd\x9a\x99\x30\x01\x32\xe9\x06\x93\x69\x9a\x32\x9e\x3e\x93\xfe\x4f\xb6\x1c\x0f\xae\xe7\x05\x1a\xe9\x40\x65\x1d\x53\xd5\x80\x69\x6d\x2f\x27\x96\xab\x98\x15\xf8\x7a\x48\xf6\xae\x8c\x8b\x9c\x5c\x51\xca\xff\x0a\x55\x81\x4c\x97\x45\x42\x53\xd6\x34\xb9\x30\xcc\x0d\x4e\x32\x86\xfa\xd3\x99\x77\x4e\xe7\x8f\x0f\x84\xe3\x38\x5b\xa5\x9d\x8d\x6d\xe0\xf9\x08\x09\xbb\x76\x38\x12\x77\x40\x16\x69\x87\x47\xc9\x48\xd2\x29\x69\xe4\xa9\x7d\x72\x2e\x44\xe1\x6e\x1a\x59\xf3\xa8\xa4\x5f\x4f\x32\xb5\xa0\xfe\x7c\x5e\xe1\x8d\x15\xec\x92\x09\xa6\xf7\x48\x8c\x0d\x84\xcf\xf7\x64\x24\x27\x32\xa3\x03\x50\x03\x74\x1c\xeb\x74\x94\x26\x4a\xbf\xe8\xb4\x76\x0c\x0d\x24\x7d\x29\x12\x6b\x3b\xe2\x3e\x11\xf8\x26\xab\xed\x53\x78\x1e\x62\x59\x26\xad\x7c\x99\xbf\x47\x41\xb4\x5f\xc4\x4a\xe7\x24\xf1\x93\x79\x25\xd6\x14\x62\x4f\xcb\x6e\x4a\x52\x7f\x21\x25\xa9\x08\x8b\x52\x89\x38\x8e\x92\x14\xbc\x84\x9b\xd3\xcb\xe8\xb6\x6e\xd4\x01\xc8\x76\x6e\xb6\x3b\x5c\x53\x14\x91\x83\x24\x62\x61\x99\xb8\x64\xe5\x9a\x64\x44\x12\x16\x36\x75\x69\x24\x1d\x6c\x88\x39\xea\xa2\xc3\x24\x00\x82\xcf\x4b\x83\xde\xb7\xe3\x29\xeb\x9a\xe1\x4d\x26\x59\x47\xe5\x7f\xb8\x7e\x12\xf2\x37\xfc\x01\xdc\xf1\x1d\x0f\x85\x09\xea\xf1\x0d\x51\x48\x1c\xba\x99\x1a\x59\xde\xf1\x5d\xd1\x5b\x41\x8d\x1b\x0d\x59\x6a\xff\xc8\x0e\x70\x26\x16\x92\x51\xb1\x48\xf6\x08\xbc\xdb\xe6\xd2\x52\x79\x6d\xb9\x50\xf0\x6e\x99\x4b\xcb\x15\x7d\xad\x50\x40\xb7\x02\xee\xcf\x2e\x9b\x66\x69\xb9\x52\xd6\x4c\x53\x5e\xae\x2e\xe9\xe5\x42\x5d\x59\x87\xcc\x27\xb3\xac\x6b\xe5\x4a\xc1\x53\x6e\xdd\xd2\x35\xa5\x48\xbf\xea\x4a\x71\x79\x69\xa9\xb2\xac\x18\x32\x03\xf3\x14\x80\x4a\x25\x65\x02\xdd\x10\x2e\x44\x61\x09\x4b\x68\x72\xa7\x05\xaf\xaa\xb8\xc8\x73\x0e\x65\x6a\x50\x9f\x04\xe1\x7a\x64\x79\x71\xcc\x17\x34\x8d\x02\x76\x30\x24\x82\x63\x48\x25\x6e\xcb\x8c\x02\x38\xbd\x9c\x43\x79\xd1\x62\x19\x4a\x52\x2d\x45\xda\x92\x0e\x02\x53\x92\x6a\xc5\x22\xba\x65\x45\x74\x4d\x67\x72\xcb\x44\xeb\x94\x33\x18\x51\x54\x17\xf5\x6a\xde\x2d\x13\x13\x63\x69\x3d\xaa\xb6\x21\x7b\x25\x12\xb6\x0c\x58\x18\x69\x8b\xa2\xec\xdd\xbe\xad\x63\x61\xf9\x03\xba\x56\xae\x16\x09\xc9\x15\x05\xc8\xa8\xa8\x9b\xa6\x69\x5d\x5e\x46\x97\xf8\xeb\xcb\x95\xd5\xaa\x52\x28\xc8\x41\xd1\x14\xeb\xcf\x1a\x2d\x59\x7d\x88\xb9\x1b\x4d\x68\x6a\x11\xcd\x83\x49\x54\xcd\xc0\x94\xac\xfa\xc6\x66\xe3\xce\xdd\x7b\xcd\x0f\xbd\xb6\x75\x7f\xbb\xb5\xf3\xa0\xbd\xdb\xd9\x7b\xf8\xe8\xf1\x93\x0f\xdb\x07\xfd\x01\x3c\x1c\x1e\x39\x1f\x7d\xea\x1e\x7b\xfe\xe8\x63\x41\x88\xc6\x27\xa7\x67\xe7\x1f\xd7\xf4\x72\xa5\xba\xb4\xbc\xb2\xba\x56\xbc\x29\x01\xcf\x24\x33\x3b\xee\xd8\x83\x78\x71\xba\xe7\x78\x68\x95\x2c\x60\xd7\xbb\x3d\xa2\x59\x1b\x87\xc8\xe5\xa5\x65\xcc\x38\xb5\x5a\xfd\x56\xc0\x5b\xa2\x5e\x2c\x2a\x5e\x37\x10\xfb\x5f\x5d\xe9\x99\x75\x22\xf0\xf5\xfd\x41\xde\x59\x8e\xba\xb2\x74\x83\x77\x7d\x10\xdb\xef\x83\x80\x71\x6a\x5c\x06\xb0\xf9\x07\xbf\xeb\x07\xf8\xfc\xc5\xe1\x1c\x5d\x32\x89\x0e\x70\x37\xf6\x00\xd0\x2b\x14\x64\x58\x2a\x81\x4c\x4c\xb9\x57\x28\xc0\x52\x89\xf6\xa8\xbe\x58\xf7\xc5\xc4\xba\xbd\x3e\x3e\x3c\x84\x41\xa1\x90\x07\x10\x93\xa2\x50\x88\x56\x14\x71\x60\x7c\x6e\xa0\x86\xae\xd3\x87\x64\x7e\x17\x32\x95\x21\xb5\x8f\xa5\xc4\x84\x0a\x70\x4d\x9a\xce\x09\x69\x50\x5f\x59\xef\xa7\x69\xde\x57\x48\xb3\x07\xa6\x56\x0b\x6e\xa1\x5a\x50\x34\xab\x8a\x6d\x7a\xdd\xc4\x88\x0f\x94\x1e\x08\x33\x81\x45\x5d\xe9\x01\x3f\x1b\x5c\x56\x7a\xc0\xc9\x06\x57\x94\x1e\x70\xbb\xf5\x62\xb1\x67\xda\xb7\x6e\x95\x2f\xc3\xdb\xb7\xab\x3c\x40\xd6\x97\x0a\xa1\x72\xeb\x56\xf5\xd2\xbf\x7d\xbb\x1c\x85\x56\x0a\xbe\x72\xeb\xd6\xf2\xe5\x72\xa5\xe0\x70\x21\xa9\x4f\xec\x44\x7c\xf7\x1c\x57\x42\x5f\x26\xb5\x98\xc1\x07\x85\x3e\x40\x34\x99\x71\x15\x21\xae\x62\x59\x61\x9a\xbd\x56\x37\x28\xea\xbd\x5b\xb7\x56\x2f\xad\x6e\xd0\x8b\x77\x10\xc4\x32\x2a\xe5\x77\x55\x46\x55\x2c\xa3\xd2\xbb\x75\xab\x5c\xc5\x85\x14\xcb\xbd\x5b\xb7\xf4\xe5\xcb\x99\x25\xbf\x82\xeb\x04\xc9\x9a\x7e\xc3\x1f\x7b\x08\x06\x1d\x72\x80\xa3\x3a\xd4\x47\x0f\xf3\xa7\xc6\x76\x1a\xe8\x16\x4f\xe4\x27\x2e\xad\x40\x59\xc5\x93\xa8\x2f\x23\xb9\x42\xdc\x14\xe0\xb7\x35\xe2\xa5\x80\x38\x6d\x25\x2e\x0a\xaa\x82\x6f\x02\xff\xa5\x7c\x13\x38\x66\x57\x6a\x6d\x49\x40\xda\xc3\x8f\xfb\x8d\xed\x3d\xa9\x07\xfa\xa6\x9c\x42\x29\x6f\x3f\x8b\x5d\x82\x46\xee\xb5\x51\x04\x51\xba\x36\xf0\xf1\x5c\x51\xd2\x17\x4d\xd3\xc9\xf1\xb9\xc8\x61\x61\x0d\x46\x57\xa9\x4d\x4e\x8f\x1c\x17\x0a\x77\xb5\xf1\xec\x71\x8f\xc8\x27\x5a\x9e\x4d\x7d\x68\x72\x07\x20\xd1\xa1\x2d\xc6\x2f\xa4\xb1\xbe\x39\xcf\x71\x4d\xc6\x01\xaa\xc5\x1c\xa0\x3a\x99\x64\xa9\x7d\x22\xc1\x75\xcb\x69\x60\x8f\x46\x30\x90\x22\x23\x60\xba\xbb\x23\xfa\x3b\x51\x64\x1f\x38\x0a\x70\x52\xae\xb1\x4c\xc9\x66\x16\xa5\x52\x14\x47\x4d\x1b\x4c\x6a\x7c\x10\x85\xa6\xcf\x31\x78\x78\xc2\x43\x27\x5e\x3c\x11\xc5\x02\x10\xaa\x99\x03\x6c\x76\x9c\x66\xe7\x29\xe5\xf2\xb3\x65\x23\xce\xf6\x10\xa5\x51\x20\x66\x16\x73\xa9\xe9\x78\x1e\x93\xcd\x4a\x90\x9d\x51\x92\x9c\x4a\xbc\x81\xa8\x57\xcf\x5c\x63\xda\x28\x01\xb5\x7d\x2b\xae\x14\xa5\xd1\x59\x5c\x38\x5e\x88\x58\xae\x33\xf4\x4c\x66\xee\x21\xe8\xd8\xcf\xa8\x13\xd3\x33\x4e\x54\x69\x2e\x5a\x95\x17\x40\x2b\x81\x14\xa5\x48\x8a\x4c\x02\xa6\xc4\xde\x84\x79\x03\x61\xd3\x9d\x6b\xa6\x0a\xcd\xb3\x3f\x4e\x15\x0a\xc6\xa6\xd0\x9e\x64\xc3\x0b\x77\xf0\xb1\x22\x18\x76\x8d\x13\x86\x5d\x0f\xae\xeb\xbd\xce\xf1\x50\x52\x6a\x0f\xc8\xee\xef\x98\xdb\x7d\xc5\x55\xf0\x47\x31\xa5\x90\x3f\x2a\xb9\xc9\x7a\xd3\xad\xeb\x54\xbd\xf9\xf6\x27\x0f\x15\x8f\xd8\x1e\x50\xe1\x93\xe0\x76\x6a\xaa\x4b\x37\xae\xbd\x36\xb1\x36\x07\x97\xe8\x93\x99\x5f\xeb\xea\xd2\x8d\xd3\x3c\x0c\x53\x81\x0c\xc3\x54\x68\x7a\x6f\xd7\x4f\x91\x9a\x60\x9e\xe3\x60\x33\x72\x88\x59\x28\xc8\xfd\x19\xf4\xe6\x67\xf0\xf2\x1d\x59\x48\x20\x8e\xce\xce\xf9\x08\x92\x4b\x8d\x52\x14\xeb\x2b\xd7\xb5\x06\xbf\x82\x25\x5d\xf2\x81\x3f\x38\xaf\xed\x25\x32\x73\x14\xd0\x5f\x97\xa1\xe0\x87\x9a\xce\x96\xd1\x2a\x52\x15\x15\x06\xe4\x3e\x80\x8a\x02\xf6\x12\x87\x98\x8e\xa2\x18\xd9\x0c\x92\x96\x4f\x0e\xb1\x68\xd7\x88\xfa\xcb\x85\xe3\x21\x38\x84\x41\x68\x74\x75\x58\x01\x6b\x9a\x06\x96\x34\x0d\x54\xd9\xd6\xf6\x1a\xfe\x04\x55\xfc\x01\xd6\xc0\x12\xa8\x02\xbd\x47\xf5\x14\x42\xa3\x2b\xdd\x97\x80\xb4\x81\x1f\x9b\xf8\x85\x3c\x24\x20\x3d\xc6\x0f\x3c\x61\x3d\x26\x0f\x09\x48\x4d\xfc\x78\x88\x5f\xc8\x43\xea\x4d\xb0\x1c\x26\x14\xbd\x06\x2b\x60\x15\x56\xc0\x0a\xac\x80\x65\x58\x01\x4b\xb0\x02\xaa\xb0\x02\x2a\xb0\x02\xca\xb0\x02\x38\x6a\xab\x9a\x06\x56\x34\x0d\x2c\x0b\x68\x56\x34\x0d\x94\x63\x74\x57\x31\x04\x58\xe6\x78\x57\x70\x24\xc5\x7e\x15\xac\x80\x65\x52\x87\x0a\x28\x27\xea\xf1\xbf\xbf\x22\x01\xe9\x7f\x7f\x19\x3f\xbe\x84\x1f\x5f\xc4\x8f\x2f\xe0\xc7\xe7\xf1\xe3\xcf\xf1\xe3\x0d\xfc\xf8\x1c\x7e\x7c\x16\x3f\x3e\x83\x1f\x7f\x86\x1f\x9f\xc6\x8f\xff\x84\x1f\x9f\xc2\x8f\x3f\xc5\x8f\x4f\xe2\xc7\x73\xfc\x78\x86\x1f\x57\xf8\xf1\x09\x09\x48\xff\xbf\xff\x85\x1f\xbf\xc5\x8f\xff\x89\x1f\xbf\xc1\x8f\x7f\xc0\x8f\xbf\xc7\x8f\x5f\xe3\xc7\x9b\xf8\xf1\x77\xf8\xf1\x3f\xf0\xe3\x6f\xf1\xe3\x57\xf8\xf1\x4b\xfc\xf8\x05\x7e\xfc\x5c\xea\x4d\xc0\xd8\x4c\xb4\x5d\x15\xbc\x08\x11\x5f\x98\x60\x6b\x40\x5f\x05\xfa\x0a\xd0\x97\x81\xbe\x74\x1d\xfd\xfe\xf1\x1b\xff\x88\x91\xfb\xc7\xaf\xd3\x9f\xaf\xd1\x9f\xff\x4c\x7f\xbe\x4a\x7f\xbe\x42\x7f\xbe\x4c\x7f\xbe\x44\x7f\xbe\x48\x7f\xbe\x40\x7f\x7e\x88\x1f\x7f\x83\x1f\x3f\xc0\x8f\xbf\xc6\x8f\xef\xe3\xc7\xf7\xf0\xe3\xbb\xf8\xf1\x1d\xfc\xf8\x2b\xfc\xf8\x4b\xfc\xf8\x0b\xfc\xf8\x26\x7e\x7c\xe3\x1f\xbf\x4e\x7f\xbe\x46\x7f\xfe\x33\xc5\x87\xfd\x7c\x95\x04\x92\x77\x82\x20\x41\x8f\x20\x47\x50\x23\x88\x11\xb4\x08\x52\x04\x25\x4c\xe2\x07\xef\x86\xc4\xaf\xb0\x9f\xfe\x9f\xe7\xb8\x37\xfc\x9f\xe7\x3f\x23\xcf\x9f\x92\xe7\xaf\xc8\xf3\xbf\x93\xe7\x4f\xc8\xf3\xc7\xe4\xf9\x23\xf2\xfc\x21\x79\xfe\x0d\x79\xfe\x80\x3c\xff\x9a\x3c\xbf\x4f\x9e\xff\x8d\x3c\xbf\x47\x9e\xbf\x24\xcf\xef\x92\xe7\x77\xc8\xf3\xaf\xc8\xf3\xdb\xe4\xf9\x97\xe4\xf9\x2d\xf2\xfc\x05\x79\xfe\x05\x79\x7e\x93\x3c\xff\x0b\x79\x7e\x83\x3c\xbf\x4e\x9e\x5f\x23\xcf\x9f\x93\xe7\x7f\x26\xcf\xaf\x92\xe7\x57\xc8\xf3\xcb\xe4\xf9\x25\xf2\xfc\x22\x79\x12\x72\x9f\xe6\x38\xdd\x00\xf5\x58\x5e\xbe\x05\x2f\x2f\xad\xdb\x68\xfd\x0e\x96\xfe\x40\x3d\xd2\xd1\x51\x8c\x40\xe5\xed\xa4\x06\x70\x30\xee\x0b\x47\xf0\x38\x1f\x8f\x2e\x4e\x6a\xd6\x6d\x13\xd5\x14\xab\x64\x22\x00\x8b\x26\xbb\x71\x38\xec\x7a\x91\x2b\x5d\x38\x01\x92\xa4\x14\xeb\x13\xb0\x37\xd3\xbf\x8c\x24\x61\x19\x1a\x5d\x5e\x5a\xa5\x12\xf0\xcc\x40\xb6\x94\xa2\x07\xac\x9b\x26\x64\x72\xb2\x75\x03\xde\x36\x63\x61\xd9\x9b\x80\x61\xae\x37\x11\x76\x52\x5a\x82\x45\x9d\xc1\xca\xd6\x2d\x6d\x5d\x2a\x49\x06\x46\x42\xde\xa3\xde\x02\xec\x83\x50\xb6\x14\x50\x07\x01\xc8\x6e\x3e\x12\x67\x37\xc9\x1d\x1f\x9a\xea\xd0\xf5\xfd\x40\xb6\x3e\x50\x57\x8a\x50\x99\x28\x45\x4f\x99\x24\xac\xe2\x63\xd5\x87\xf4\x16\xcd\xed\xb2\xb0\xd0\x8e\x37\x69\xca\xbd\x75\xf1\xc3\x90\xd4\x05\x09\x04\x66\xa4\x63\xc8\x6a\x9b\x44\x3a\x00\x8b\x7a\x0e\xd6\x0b\xb0\x9b\x40\x32\x50\x7a\x13\xa5\x88\xd2\xc6\xf3\xb8\xe5\x40\x1d\x50\x23\x4c\xeb\x56\x69\x6d\x6d\x6d\x0d\xf7\x00\xfc\xcb\xd7\x29\xb8\x2f\xd8\x69\x93\x34\xd1\x56\x45\xec\x27\x35\xba\xd0\x10\x31\x74\xcc\x7a\x2d\x6d\xe2\x09\xbb\x5a\xaf\xe8\x44\x3b\x3f\x7d\x53\xab\xf9\xb7\xb5\x42\xa1\x7f\xcb\xac\xd6\xfa\x5c\x97\xd2\x35\xfd\x0f\xe8\x5a\x0d\xa7\x74\x0b\x05\xb6\x94\xe0\x8e\x3e\x43\x62\x7b\x2b\x49\x78\x95\xb5\xee\x98\xb0\xeb\xf6\x8a\x8e\xe1\xde\xd6\x2f\x2f\x75\x9a\x00\xa7\xeb\x47\x5f\xf8\xa7\x9f\x93\x4b\x59\xb9\x16\xa4\xaa\x14\x0a\xd6\x6d\x5d\xd3\x22\xc8\x3e\xb9\xd5\x2d\x0d\xb7\xaa\x70\x44\xe4\xfe\x6d\x6d\x1d\x75\xfb\x25\xbd\x47\x7a\x9a\x63\x44\x09\xb5\x42\x41\x76\x4c\x1a\x57\x74\x14\xc0\x88\x45\x1b\xca\xbf\xa9\x47\x5b\x63\xa4\xab\x7a\x34\xf9\x04\xdc\x31\xf3\x56\xd4\x33\x6e\x1a\x5c\xc7\x5d\xc7\x90\x24\xe0\xe1\xf7\xe9\x27\xae\xc8\x47\x1d\x7f\x00\x12\x51\x4b\x69\x16\x66\xdb\x97\x58\x1a\xb2\x9d\xc8\xff\xfb\x89\xef\x4a\x39\xcb\x0b\xda\x0f\xa8\x29\x22\x87\xfc\xda\xf7\x67\x42\x32\x5b\xc5\x08\xf2\xb7\x33\x21\x73\x8d\x16\xe9\xfa\x76\x28\x5b\xa0\xba\x0a\x96\x56\xc0\xa2\x06\x02\x41\x3b\x81\x6d\x7e\x56\xd7\x25\x4d\x2a\x86\x46\x38\x13\x5f\xc1\x3c\x92\x25\xde\x90\x2d\x20\x4d\x3f\xf1\x9f\xde\x7a\xf3\x13\x6f\xfd\xfd\xe7\xde\x7a\xf3\xcf\xde\xfe\xe6\x37\xdf\xfa\xfb\xaf\xbc\xfd\xa7\x3f\x79\xeb\xcd\xe7\x6f\xff\xe9\x8f\xde\xfa\xf5\xb7\x24\xc0\x5c\x99\xe6\xe4\x28\xda\x52\xb2\x1c\x4f\x65\x0b\xe8\xa0\xb2\xb6\xb6\x06\xfa\x39\x63\x87\x8f\x9b\x40\xc9\x53\xd7\xcc\xc2\x8b\xf6\x99\x2f\x5b\xc2\x7c\xac\xa9\x95\x27\xcb\x13\xd3\x76\xad\xba\x04\xd6\x96\xd7\x30\x53\xb9\x2e\x2d\xb5\x02\x15\xd3\xae\x00\xbd\x5c\x9e\x9f\x54\x34\x20\x15\x92\x2e\x2f\xe1\x09\x7b\x6e\xca\x84\xad\xa9\x90\x54\x5f\xae\x94\x81\xbe\x5c\xd5\x59\x8f\x98\x99\x9c\x99\x12\xce\x47\x8c\x43\x25\xc8\x8c\xb9\x21\x70\xff\x00\x32\xbf\xeb\x6c\x5f\xac\x7f\x70\x53\x5b\x81\x2a\xe5\xa5\x4a\x15\x94\x97\xaa\x95\xf9\x54\x89\x2d\x73\x67\x00\x50\x83\x55\xb1\xa5\x74\xbd\x0c\x96\xf5\xf2\x35\xe4\xce\xb1\xf2\x15\x47\xdb\xdb\x3f\xf9\xc2\x5b\x6f\x7e\xf1\xed\x9f\xfe\xe9\xdb\x6f\xfc\xf4\xf7\xbf\xfd\xd9\xdb\x7f\xf7\xcb\xb7\xdf\xf8\xf4\xef\xfe\xe2\x87\xff\xf4\x95\x5f\xfe\xf3\x9f\xfe\xd9\xef\x3e\xfd\xb9\xb7\xfe\xfe\xbf\xcd\x1b\x73\x59\x73\x61\x31\xf7\x7f\xfa\xca\x2f\xde\xfa\xf5\x37\xde\x7a\xf3\x1b\x6f\xbd\x79\xf5\xbb\x4f\x7f\xe6\xed\xbf\xfb\xf9\xdb\x7f\xff\x5f\x7e\xff\xdb\x6f\xbe\xfd\x5f\x7f\xfc\x4f\xdf\x78\xf3\xba\x7c\x45\x8b\xe3\x19\x60\xf9\x66\xab\x0c\x85\x01\x46\xe1\x9f\xbf\xf9\x3f\xe6\xb2\x13\xe9\xed\x37\xae\xfe\xe9\x1b\xbf\x7d\xfb\x8d\xe7\xbf\xff\x02\x96\x26\x7f\xff\x8b\xbf\x92\x80\x07\xf4\xea\x4c\xd4\xf2\x2c\x68\x53\x25\xbe\xfd\x5f\x7f\xfd\xfb\x5f\xfc\xf2\xed\xcf\x3f\xff\xfd\xb3\x4f\xbd\xf5\x9b\x37\xfe\xf9\x1b\x6f\xfe\xee\xdb\x5f\xfa\xdd\x1b\x9f\xfb\xa7\x3f\xc7\x02\xe2\xef\x3e\xfb\xdb\xb7\xfe\xe7\xcf\xde\xfa\x87\x6f\x27\x4b\x5c\x9a\x59\x62\xbe\xc9\xef\x1f\x54\xcb\x5f\x7d\xfb\x9a\x5a\xe6\x59\x1f\xe7\xd4\xf2\x57\x3f\x7b\xfb\xf3\x57\xbc\x96\x9f\x9a\x57\x4b\x56\xe2\xec\x5a\x66\x0d\xba\xc5\xf2\xae\x9b\x16\xe2\x1a\xbe\xf5\x26\x5e\xa1\x4e\x9f\xff\xe5\xf4\xd9\xf7\xa6\xcf\x3f\x33\x7d\xf6\x6b\x5c\xb0\x76\x7d\xb9\xb3\x6a\xf9\xf3\xb7\x7f\xf3\x85\xb7\x3f\xff\x0c\x97\xfa\x9b\x37\x52\xa5\xfe\xee\xb3\xbf\x9d\x57\xea\xca\xcc\x52\x73\xed\xce\xc5\xa2\xdf\xf9\xfa\xd5\x3b\xdf\xfa\xcd\x3b\xdf\xfa\xd5\x3b\xcf\x7e\xf3\xce\xb3\x1f\xbf\xf3\xf5\xef\xbd\xf3\x17\xdf\x79\xe7\xd7\x7f\xf5\xff\x7c\xee\x2b\xff\xff\xbf\xc5\x14\x7d\xe7\xb3\x3f\xf9\x97\x9f\xfd\xfc\x9d\x5f\xfc\xc5\xbf\xfc\x35\x5e\xab\xff\xcb\x5f\x7f\xfa\x9d\x6f\xfd\xea\x5f\x3e\xf9\xe9\x77\x3e\xf3\xbd\x05\x09\xd4\x5f\xa8\x6c\xd1\x88\xfd\x0f\xe9\x4f\x99\xc2\x67\x93\x3b\xcf\xb0\x7e\xd6\xf0\xc9\x2d\x3a\x22\xf9\xcb\x55\x5a\x70\x58\x20\xb2\xe7\xaa\xb6\x0c\xca\x55\x7d\x69\x3e\x17\x8d\x7c\x19\x24\xe6\x0d\x9d\x4c\x1c\x0f\xde\xd5\x7c\x14\x79\x44\x10\x91\x59\x59\xd3\xf0\x63\xed\x1a\x64\xb8\x03\x05\x31\xe9\xf2\x72\x19\x94\x97\x57\xae\x99\x0d\x98\xbf\x85\x64\x2d\x34\x5c\x8b\xf1\xbb\xaa\x45\xe4\xb5\x21\x21\xc1\x5d\x3d\x9b\x5e\x7d\x72\x7a\xf5\xa9\xe9\xd5\xa7\xa7\x57\x9f\x99\x5e\x7d\x76\x7a\xf5\xc6\xf4\xea\xf3\xd3\xab\x2f\x4e\xaf\xbe\x3c\xbd\xfa\xea\xf4\xea\x6b\xd3\xab\x6f\x4c\xaf\xbe\x39\xbd\xfa\xd6\xf4\xea\xdb\xd3\xab\xef\x4c\xaf\xbe\x37\xbd\xfa\xfe\xf4\xea\x07\xd3\xab\x1f\x4e\xaf\x7e\x34\xbd\xfa\xf1\xf4\xea\x27\xd3\xab\xff\x3e\xbd\xfa\xe9\xf4\xea\x17\xd3\xab\xbf\x9d\x5e\xbd\x39\xbd\xfa\x87\xe9\xd5\x6f\xa7\x57\xff\x6b\xfa\xec\x13\xd3\x67\x57\xd3\x67\xcf\xa6\xcf\x3e\x39\x7d\xf6\xa9\xe9\xb3\x4f\x4f\x9f\xfd\xd9\xf4\xd9\x67\xa6\xcf\x3e\x3b\x7d\xf6\xb9\xe9\xb3\x37\xa6\xcf\x3e\x3f\x7d\xf6\x85\xe9\xb3\x2f\x4e\x9f\x7d\x69\xfa\xec\xcb\xd2\xb5\xe8\x33\xbf\x10\xc9\x4a\x7c\x12\xe7\x84\xcb\xff\x11\x29\xf9\x4d\x82\xdd\x77\x70\x39\x57\x3f\x26\x45\x7d\x09\x97\x73\xf5\x59\x5c\xfe\xd5\xb7\x71\xc9\xb8\x36\xdf\x23\x88\xff\x90\x60\xf4\x09\x4c\x83\x67\x5f\x20\xf5\xf8\x0c\x26\xc0\xb3\x4f\x92\x1a\x7c\x91\x54\xe8\xcb\x84\x3c\xdf\x27\xd4\xfa\x2a\xa6\x10\xae\xca\x15\xae\xdf\xd5\xd7\x30\xee\x57\xbf\xc0\x55\xc4\x44\xfa\xc6\xec\x1a\x70\x87\x17\x42\x57\xa8\x54\xb4\x32\xa8\x54\xf4\x6b\xba\x42\xe4\x1f\x23\x51\xeb\x67\xdf\xc5\xfc\xeb\xd9\xf7\xa7\xcf\x7e\x30\x7d\xf6\xc3\xe9\xb3\x1f\x4d\x9f\xfd\x64\xfa\xec\xa7\xd3\x67\x3f\x9f\x3e\xfb\xe5\xf4\xd9\xdf\x4e\x9f\xfd\xdd\xf4\xd9\xaf\xa7\xcf\xfe\x61\xfa\xec\x7f\x4e\x9f\xfd\xaf\xe9\xf3\xab\xe9\xf3\x4f\x4e\x9f\x7f\x6a\xfa\xfc\xd3\x98\xeb\x3d\xff\xec\xf4\xf9\xe7\xa6\xcf\xdf\x98\x3e\xff\xf3\xe9\xf3\xcf\x4f\x9f\x7f\x69\xfa\xfc\xab\xd3\xe7\x5f\x9f\x3e\xff\x26\xe6\x8c\xcf\xbf\x3d\x7d\xfe\x57\xd3\xe7\xdf\x99\x3e\xff\xee\xf4\xf9\xf7\xa6\xcf\xbf\x3f\x7d\xfe\x83\xe9\xf3\xbf\x99\x3e\xff\xe1\xf4\xf9\x8f\xa6\xcf\x7f\x3c\x7d\xfe\x93\xe9\xf3\x9f\x4e\x9f\xff\x6c\xfa\xfc\xe7\xd3\xe7\xbf\x98\x3e\xff\xe5\x3c\x11\x21\xe5\xd4\x23\x59\x8d\xef\x91\xbc\x3e\x4f\x10\xfa\x26\xc1\xe0\xd3\x04\xd7\x1f\x12\xfc\x7e\x44\x72\xff\x29\xae\xde\xf3\x1f\x90\x6a\xfc\x18\xd7\x07\xd7\xe4\x0d\x52\x8d\xbf\xc1\x88\x3e\xfb\x3e\x41\xe5\xcf\x09\x21\x7e\x4a\x30\xfe\x4b\x4c\x88\xe7\x5f\x25\xb4\xf8\x01\xae\x36\xa6\xd7\xdf\x62\x1a\xe1\xca\x7c\x07\xd7\xf0\xd9\xdf\x11\xec\xbf\x84\x2b\x89\xc9\xf4\xeb\xb9\x4b\x16\xab\x95\x68\xba\x95\xb5\x32\xa8\xac\x6a\xd7\x34\x5d\xec\x45\x24\x21\x0f\x2e\x6b\xf8\x71\x0d\xf3\xe0\x4e\x47\x84\x94\x55\x9c\xb2\x7a\x6d\x4a\xea\xa3\x44\xe4\x39\x6b\xfa\x2a\x28\xaf\x95\x57\xe6\xa7\xe3\x2e\x4d\xc4\xa5\xc2\xca\xca\x32\xd0\x57\x56\xaf\xe1\xba\xd4\xa3\x89\x48\x1f\xad\xba\x0c\x2a\xda\xd2\x75\xe9\xa8\x03\x14\x31\xa1\xbe\x52\x05\x15\x7d\xf5\x1a\x29\x9c\xf8\x4b\x11\x93\x2d\x2f\x57\x41\x65\x79\xe5\xba\x64\xcc\xbd\x8a\x98\x72\x75\x05\xb7\xe4\xea\x35\x2d\xc9\x17\xc0\x29\x83\xbd\xd4\xe2\xfa\x15\x5d\x6a\xfb\xc7\x6a\x5d\xbb\x4c\x8d\x6b\x75\x3d\x63\x5c\x2b\x6c\x15\xf2\x3b\xb4\x99\xea\x14\xd1\x92\xb5\xe8\x8d\x97\xbb\xc8\x1f\x85\xb3\x95\x2a\x43\xe4\x8f\x26\x44\xb7\x51\xbf\x19\xdd\xc4\xad\x03\xa4\xd4\x12\xe9\xf3\x1c\xc3\x91\x0b\xeb\x36\x38\x8c\x1c\xdc\xa0\xb9\xf1\x82\x55\xc4\x6f\x92\x51\x94\x89\x32\x01\xe1\x2c\xb3\xe0\xf7\xd5\x24\x98\x2a\x1c\x98\xf0\xf2\x72\x30\xe3\x64\x97\x5b\x18\x89\xa6\xc1\xcc\x2a\x38\x80\xde\x00\x06\x19\x7b\x60\x4b\xb9\xa0\x79\xa3\x33\x53\x28\x24\x63\x81\x44\x31\xf0\x47\x38\x51\x68\x5a\x22\x42\xec\xbc\x55\xdc\x7c\x65\x3e\xf9\x2d\x35\xec\xdb\x2e\x4c\xa0\xcf\x0f\x62\x13\xe0\xcc\xc5\x7e\x2e\xbc\x78\xa6\xcb\x32\xa6\x67\xb8\x59\x20\x96\x75\x74\xbd\xbd\x00\x86\xce\x68\xde\xb2\x58\x0f\x1a\x04\xb2\x41\x4a\x9c\x8a\x5c\xee\xe5\xda\x08\xca\x25\x4b\x3d\x03\x25\x4b\x3d\x17\x63\xe1\x19\xaa\xdb\x21\x74\x1d\x0f\x9a\xdc\x31\x25\xb0\x54\xd7\x1f\x0e\x61\x80\x7f\x48\x43\x9f\xd8\xe1\x02\x6d\x00\x18\x2c\x38\x9e\x83\x98\x39\xd0\x82\x2c\x15\xa3\x3a\x9d\x49\xc5\x18\xf3\x05\x1b\x2d\xe0\xef\xb3\xa2\x04\xf0\xef\x79\x51\x52\x16\x4e\x1d\x74\xb4\x40\x10\x5c\x90\x8a\x39\x58\x47\xf7\x51\xf5\x5d\x67\x94\x6d\xea\x78\xcc\x91\x5b\x93\xb9\x42\x15\xbf\x68\x98\xd0\xc8\x3e\x81\xb2\x02\xac\xdc\x41\x83\xd4\x91\x8d\x8e\x64\xdc\x1d\x09\x30\x2e\x45\x56\xf0\x08\xa4\x69\x78\x76\x51\x6e\x01\x0c\x91\x1f\x40\xe1\xce\xbd\xc8\x3c\x29\x0f\x3b\xcc\x6d\xa3\xb4\xa2\x21\x13\xd5\xdf\x00\xe4\x34\x1c\xf0\xbb\x0f\x78\x73\x03\x44\x63\x11\x89\x8d\x6f\xb2\xe0\xb7\x54\x88\x45\xef\x1e\xd9\xa3\xdc\xa2\x59\xc1\x51\xfd\x38\x16\xb1\x3d\x19\x14\x78\x42\x32\x5e\xa8\x1e\xfe\x9c\x37\xc4\x84\xfc\xac\x17\xc9\x6f\x08\x51\xc7\x0e\x86\x70\xce\x85\x76\xf3\x06\xad\x1a\xc2\xd8\xa0\x3f\x71\x99\x29\x48\x1b\x72\x09\xd9\xc4\xc5\x63\x72\xe4\x55\x87\xea\x83\x91\x4e\x14\x61\x7e\x00\x87\x8e\xb7\x83\xe9\xa7\x80\xa4\x32\xa4\xa5\xac\xe7\xf5\xa7\x78\xf3\xde\xa2\x3e\x10\x4d\xd3\x13\xbd\x20\xae\x5b\x86\x45\x2f\xbc\x26\xc7\x21\x68\x1d\x92\x72\x8e\xfd\x13\xd8\xf1\xe5\x40\x3d\x03\x81\x7a\x4e\xf4\x12\xd0\x19\xb9\x3c\x58\x08\x05\xe9\x2c\x45\xe7\x92\x85\x02\x64\x18\x7f\xdc\x81\x01\xb9\x8f\xb3\xe3\xcb\xac\x2c\x4c\xbf\xc0\x77\xd5\x33\x90\x0a\x38\x07\x96\x0a\xbd\x81\x18\x2f\x7c\xb2\x58\x1e\xac\x9e\x2b\x13\xc5\x88\x68\x63\x07\x7d\x19\x0f\x65\x4b\x0d\xc8\x35\x9e\x00\x8f\x67\xe1\x83\xbd\x68\xa0\x7c\x83\xb0\xc5\x9d\x26\xc0\xd3\x74\x94\x9e\xb8\x67\xa1\xb4\x8d\xda\x26\x80\x7d\x64\x7b\xc3\x9c\x1b\xe6\x84\xd3\xc0\x9c\x7e\xe7\xcd\xec\x77\xc4\x4a\x92\x9f\x4b\x0a\xe5\x60\xb6\xb5\xe5\x78\xd0\x0e\xf8\xd5\x26\xd7\xb1\x16\x8a\x34\x99\x9a\x92\x09\x65\x8b\x7b\x6a\x1f\x38\xb8\x02\x8e\xef\xa9\x67\x3a\x6e\x2d\xe2\xa8\x3d\x0e\x3c\xd7\x41\x1e\xa8\x96\x07\xaa\x29\x35\x9b\xf8\xb5\xc8\x1b\xb6\x28\xaf\x8e\x94\x61\x90\xac\x00\x63\xbf\xc0\xca\x30\x0c\x5a\xf3\xb6\x3d\x70\x6c\xf7\x45\x6b\xce\x4c\x01\x08\xde\x7d\xe8\x21\x88\x7b\xa4\x67\x72\xac\x59\xd0\x39\xa8\xa7\xe9\x94\x2c\x46\x0e\x80\x07\x34\x72\x54\x0d\x59\xef\x50\xcf\xd8\x7d\x70\xce\xa1\x8c\xab\x5b\xcf\xad\x6e\x5d\x80\x5f\x34\xcd\xe8\xe3\x9c\x6b\x4b\x32\xec\xd4\xa5\x1b\xbc\xe2\x3e\xc3\x8e\x04\x31\x96\xea\x08\x29\x6f\xc6\x39\x82\xbe\xa9\xdf\x74\xe8\x98\x8f\x2e\xbd\x94\x43\xe0\x83\x2e\x65\x2e\x0e\x7e\xf6\x40\x0e\x97\xca\x6d\x81\xfe\x0d\x99\x94\x5d\xf2\x95\xa2\x9f\x69\x89\x1b\x7d\x2c\x7b\x11\xbb\x85\x3f\xb4\x0d\xa9\x5f\xec\xeb\x06\xca\x1c\xee\x9f\x6a\xad\x1d\x1b\x21\x18\x78\x94\x6b\x06\x30\x74\x3e\x0e\xb9\xbd\x32\x52\x00\xf7\xc3\x9d\x2b\x45\xe0\xe2\xd2\xfc\x3e\x57\xda\x08\x40\xc9\x4b\x57\x64\xa6\x5b\x97\x94\x06\x80\x9d\x62\xce\x87\xbe\x87\xcc\x2e\xd3\xb0\xc3\x15\x02\xf4\xfd\xa1\x1d\x38\xb6\x87\xd8\xd7\x23\x3e\x9f\x72\x45\x3c\xf6\x7a\xc7\x3e\x76\xdc\xf3\x9e\xfa\x51\xdf\xf1\x88\x35\xdd\x0c\xf9\x00\xf7\xcc\x79\xb3\xa6\x57\x28\x50\xa3\x32\xee\x8d\x9d\x39\x5e\xf2\xa8\x96\xbd\xac\x29\x6a\x00\x4f\x60\x10\x42\x39\xc7\x9d\x33\x54\x2e\x68\xee\x21\xb9\xc3\x9c\x08\xef\x26\xcc\xc8\xeb\x40\x04\x6a\x1d\x1e\x86\x10\x3d\x36\xa1\xea\xd3\xb7\x1b\x76\x4a\xf6\xcb\x42\x3f\x89\xa0\x9f\xcc\x85\xae\xbb\x63\x5c\xfe\x81\x3b\x0e\x40\x5c\x6d\xdc\x42\xcc\x74\x8e\xb8\x1b\x89\xf4\x4d\xe3\x2f\x3c\xd8\xac\xa4\x16\x23\x9e\x2d\xfe\xe0\x3c\x00\xbb\x99\x36\xe0\x63\x3d\xc8\xb3\x43\xbc\xbc\x84\xb5\x74\x04\x66\xd2\xb9\x04\x4f\x9d\x99\xd7\x73\x8d\x54\x63\x1b\x52\x76\xad\x66\x4c\x35\xdc\x7b\xee\x43\xbc\x76\x26\xc2\x09\x7b\x95\x91\xa2\x1e\x30\xa1\xb9\x66\xab\xd1\x4c\x26\x27\x2b\x2b\x78\x59\x49\xd4\x3b\x50\x62\x3a\xd0\x71\xaf\x83\x50\x11\x55\x82\x67\xe0\x19\xd9\xcf\xbe\x74\x99\xef\xb6\xc4\x84\x99\x2e\x33\x5e\x7a\x01\xe2\x1c\x3b\x83\x81\x7b\x2d\x69\xfa\xd0\x71\x93\x94\xf1\x72\xf1\x24\xd6\x71\x22\x27\x89\xd8\x55\xfe\x6c\x46\x1c\xd9\xd0\xf5\x96\xc9\xaf\x96\xc3\x23\x97\xad\xae\xcc\xe8\x4a\x36\xae\xda\x62\xd5\xc4\xa9\x9f\x8a\xa2\x73\x15\x90\x23\x47\x18\xd1\xec\x40\x8b\x83\x29\xe1\xdd\x14\x64\xfc\x8c\x6c\x9b\xf2\x74\x90\x99\x04\x48\x60\x7a\xb1\x40\x3d\x99\x53\x42\x84\x10\xb5\xe8\x0d\xdd\x73\x45\xf6\xa1\xeb\x1f\xd8\xae\xe5\x8e\x8e\x6c\x33\xbe\xaf\x3c\x9a\xfe\x66\xb1\x62\x21\x07\xb6\xa8\xca\x61\xf2\xe4\x76\x94\x64\x38\x99\x52\xa3\x4b\x16\x00\xea\x96\xf1\xa3\x82\x1f\x55\xfc\x58\xea\xcd\x58\x9c\x82\x12\x54\x40\x20\x96\x23\x2c\xbf\xb2\xbe\xb9\xc2\x7f\xdf\xe9\x7a\x6f\x76\xba\x6a\x74\x5c\xff\x5b\xf1\x1b\x07\x3d\x5c\xf9\x41\xae\x5d\x1c\x75\x58\x53\x28\xb0\x2d\x0f\xb2\xbe\x31\x83\xcb\xcb\x4d\x1b\x41\xd5\xf3\x4f\x79\xe7\x71\x06\x26\xca\xd9\x42\x22\x0a\xe0\x59\x8f\x72\x89\xdb\xd5\x2c\x59\xc4\x02\x88\x25\xc5\x2c\xc8\xf5\xf3\x2e\x7c\x77\x0e\x13\x69\x0b\x05\xe6\x5f\xa7\xef\x7b\xa1\xef\xc2\xf4\xb7\xea\xfa\xc3\xb8\x53\x65\x4d\x4b\x01\x34\xf9\xfa\x13\xd0\x2e\x67\x91\xbe\x86\x3b\x99\x99\xb0\x13\xbd\xc3\x70\x10\xcc\xfe\x0e\x1c\x6f\xa0\x62\xaa\xcb\xd9\x42\x41\x32\x48\x61\x1b\x97\xc9\x50\xd0\x8d\x89\x5a\x8a\x69\x50\x94\x8e\x43\x89\x13\x79\x5d\xb4\x23\x5a\x90\xd9\x96\x8e\x33\x28\x4a\x8a\x21\x19\x62\xa4\x21\xf5\x70\xc6\x7d\x1b\xc9\xdd\x1e\x95\x96\x28\x76\x10\x68\x8a\x42\xb6\xad\x29\x65\x89\x9f\xa6\xf7\x80\xb6\x24\x9f\xf7\x9f\xba\xa4\xd8\x7f\x93\xf4\xcd\x32\x50\xef\x15\x39\x42\x60\x97\x4b\x9a\x30\x79\xef\x62\xd6\xf7\x81\xfe\x62\xbe\x0f\xd2\xf9\x5c\xe3\xd4\x80\xed\xd4\x77\xc9\x25\x39\x80\xd9\x5b\x81\x68\x6b\x93\x9a\x35\xf5\x6a\x29\x64\x73\xf6\xe7\xed\x8c\x07\x03\x81\x4d\xcc\x77\x61\xc0\x2f\xd3\x92\x8a\x90\xec\xbf\xbf\x9a\xa9\x0a\x12\x81\xf0\xce\x56\xeb\xd1\xfe\xa3\xb6\xb5\x63\x5e\x6c\x53\x1d\x09\x0d\xd4\xdb\x0d\xeb\xb5\xfd\x47\xad\xf6\xa6\xa1\x47\xee\x4b\x5a\x27\x30\x38\x74\xfd\xd3\x47\x81\x3d\x9a\x7b\x3b\x11\x96\x0a\x4b\xa7\x7e\x10\x3b\xdf\x08\xd4\x38\x47\xee\x48\x97\xfa\x00\x4e\x1d\x47\x05\x2a\xc5\xe1\x55\x9d\x43\x41\x35\xbe\x89\x63\xb7\x63\x75\x9a\x1b\xb8\x27\x34\xb6\xac\x4e\x93\x5c\xba\x62\xd5\x77\x5b\x5b\x7b\x9d\x86\x51\x06\x77\x9a\x8f\x89\x0b\x9b\xdd\x4e\x73\xe3\xb5\x27\x46\x35\xa2\x43\xce\x1d\x9b\x19\x1a\x04\xd0\xb5\x91\x73\x02\x05\x0a\xf0\x52\x98\x07\x7b\x6e\xf9\x18\x03\xf0\xb2\x29\xc0\xa1\x73\x06\x45\x02\x12\x74\x98\xc3\x68\xe4\xf4\x9f\x9e\x0b\x71\x14\xc5\x89\xf0\x8d\x6b\xf6\xca\x48\x98\xf4\x11\x1a\xb9\x11\x89\x3d\x93\xea\x20\xf6\x1b\x5a\x06\x82\xeb\xd1\x4a\xc2\x17\x4e\xb4\x33\x3b\xd7\x67\xcf\x68\x04\x03\xf2\x16\xd7\x37\xca\x5d\xf0\x21\x9e\x02\x89\x90\xe1\x0e\xff\x47\x0e\x22\x47\x0e\x02\x4c\x8c\xd8\x44\xe8\x7e\xc4\x93\xf3\x7b\xcd\xd8\x02\x48\x9c\x5e\xa3\xa6\x37\x1a\x33\xc7\xb1\x91\x69\xf4\x2e\x71\xbe\x19\x1b\x46\xd3\x50\x4c\x20\x2b\x80\x76\x3a\x9c\xe4\x90\xb0\xa2\x66\x79\x06\x6c\xaf\x6e\x8c\x73\x6e\x6e\xef\xec\x75\xf6\xe3\x7b\xcc\xe3\x20\xe2\xde\x65\x37\xfa\xde\x68\x6d\xb5\xda\x49\xf3\x6b\x97\x59\x5b\x7b\xf4\x26\x1b\x72\x80\x59\x56\x80\x4d\x22\x96\x34\x72\x47\xbc\xcb\x6e\x8b\xf7\xc9\x1b\x31\xe0\x23\x6f\xba\xa2\x80\xbe\x29\x93\x2b\xe4\x89\x53\x61\x80\xe4\xaa\x22\x98\x6a\xbb\x2f\x6c\xaa\x9d\xc4\x10\xf3\x4c\x3f\xe2\x99\xdd\x6a\x19\x90\x7f\x3d\xda\x2b\xc7\xe9\x78\x7d\x79\x09\xb0\xbf\x9e\x02\x1e\xa4\xa3\xcb\xe5\x32\x60\x7f\x3d\x05\x9c\x9a\x17\xa2\x63\x15\x1d\x88\x2e\x58\xc6\x09\x17\x2c\xf5\x84\x07\x1d\xe6\x1a\x86\x5e\x84\x9e\xa4\x6f\xf7\x14\x90\xff\x7b\x20\xa7\x31\x32\xf7\x4a\x3e\xc8\x5c\x1c\xd9\xed\xa5\x2f\x8d\xf4\xd2\xb7\xda\x8b\x97\x2b\x66\xaf\x8f\xf4\xb2\xb7\xd8\x8b\x09\xe8\xb5\xd6\x4e\x7c\xa3\xdb\x92\xf6\x01\x7a\xbb\x75\x77\x0f\xec\xf5\xc0\x86\xd9\x1d\x02\xf2\x7f\x0f\x0c\xcc\x14\x6c\x65\x74\x26\x29\xe0\x8e\xd9\x1d\x80\x41\x0f\x34\xcc\xee\x1d\x40\xfe\xef\x81\x43\x66\x46\x9f\xed\x93\x39\x37\xdf\x05\xf6\xc0\xa1\x57\xdf\x91\xc3\x8a\xf5\x0d\xa3\x11\xdb\xbe\x27\xfa\x79\x66\xf5\x90\x4e\x7b\x79\x29\xf5\x8f\x60\xff\xe9\x81\x7f\x16\x07\x72\x2f\xbc\x38\x02\x0e\x92\xc7\xed\x8e\x97\xb2\x33\x06\x29\xbb\x5a\x2c\xe9\xa4\x0d\x3e\x73\xca\x58\xef\xd2\x5b\x9e\xa3\x8b\xf1\xc5\x6d\x8a\xa2\x5a\x59\xab\x2c\x57\x6e\x20\x20\x5a\xb0\x16\xd5\x95\xb5\x1b\x88\xde\x61\x3a\x33\xa1\xbe\x9c\x49\xb5\xb4\x54\xbd\x3e\x5d\x79\xa5\x52\x5d\xc9\x24\xad\x56\xb5\x15\xfd\xda\xb4\x95\xb5\xe5\xb5\x6a\xb6\xd8\xe5\x17\x28\x76\xa5\xbc\xb6\x9a\xad\x67\xb9\x72\x6d\xc2\xd5\x6c\x81\x95\xaa\xb6\xba\xf4\x02\xc8\xce\xa4\x2c\xf5\xf6\x62\xcf\x48\x89\x6e\x56\x93\x89\x70\x00\xba\x59\xc5\x52\x2e\xd9\x6b\x3f\x94\xc9\x26\x38\xe6\xfc\xc4\xb7\xeb\x2c\x8e\x9c\xec\x94\xb8\xa7\x11\x96\x4f\x13\x6a\x42\xc2\x24\x83\xcf\x3b\x39\xb1\xf8\x9e\x58\xd7\x62\xbe\x98\xe1\x80\x18\x4b\x5f\x5e\x6a\xbd\xda\xa1\x8c\x0a\x05\x44\xb6\x2c\x2f\x2f\x25\x49\xc4\x2c\x6f\x5e\xc9\x55\x15\x21\x7d\xfc\x36\xdf\x1a\x5a\xe7\xe7\x50\x26\xdf\xe9\x2a\x45\x47\x07\x37\xcb\x7c\x27\x29\xd2\x23\x50\x0c\x16\x72\x8b\x87\x14\x0a\xf4\xe0\x82\x64\xc0\x0c\xd1\x19\x0c\xcd\x20\xd2\x44\xe0\x77\x88\xa7\xe7\xd4\xd8\x56\x0f\xe6\x99\x70\x93\x91\xcb\x4d\xcc\x0a\x85\x3a\xdf\xd6\x4f\x03\xbf\x88\x5f\x0a\x59\x03\xfd\xb4\x43\x8a\x74\x3e\x73\xdd\x62\x40\xe6\x16\xc3\x56\x80\x3d\xc7\x87\x85\x2d\xfa\x5a\x40\x89\x4e\x47\x14\x31\x6c\xc1\xa4\x1d\x89\x3d\x90\xc4\x7a\x97\x97\x32\x87\x38\x3d\x72\x10\xdc\x1d\xd9\x7d\x68\x4a\x9e\x8f\x6b\x22\x71\x97\xad\xf9\x04\x88\xac\xd7\x2d\xa5\x66\x27\xac\xdf\x43\x05\xd4\x13\x01\x36\xd1\x5e\x48\x71\xb6\x20\xdf\x16\x3e\x04\x48\xc1\xe9\x45\x5b\x78\x5b\x99\x4c\x14\x70\x94\xe3\x1f\x45\x1a\xd9\x61\x48\xe4\xfe\x98\x3d\xc6\x5e\x82\xd8\xf0\x60\x8d\x5a\xd4\x15\x76\x9c\xf2\x7f\x3f\xf1\x5d\x09\x77\x30\x12\xcb\x37\x44\x35\xb2\xcb\xca\x8e\x47\x2c\x95\xf8\xa9\x3f\xf2\xdd\x01\x0c\xf0\x08\x30\xe0\xab\x72\xc2\x17\xfb\xf5\xc7\x72\x6e\xfc\x91\x59\x7b\x96\x23\xcd\x2e\xe2\x95\x46\xd7\xb0\x54\x24\x07\xa6\x3d\x77\x2d\x0a\x7c\xe6\xba\x86\xfa\xa1\x49\x14\xf1\xaf\x79\x03\xa3\x70\xd5\x02\xbb\x5c\x01\x4d\xa8\x4b\x9c\x34\x55\xd2\x54\x8f\x1d\x79\x69\xe4\xb8\x35\xc7\x2f\xcb\xba\xac\x01\x3f\xe1\x4c\x4e\x91\xad\x59\xae\x02\x09\x6c\xca\xf4\xd6\x52\x26\x8a\x41\x22\xc8\xd2\xf2\x91\x1f\x0c\x70\x16\x00\x52\xdf\xe1\x6c\x3f\xc6\x36\x11\x73\xa0\x83\xbb\xee\xba\xf8\x31\x7b\xac\x53\x9f\x94\x63\xd3\x5e\xb7\xd5\x91\x3d\x84\x8f\xe9\x11\x98\xa1\x81\x07\x51\xd8\x93\x28\xec\xd4\xec\xf6\xc0\x9e\xa9\x81\xa1\xa9\xd5\x86\xb7\xbc\xda\x90\x6f\xdd\x6e\x98\x41\x77\xd8\xa3\xde\xfc\x63\x47\x28\xf1\x01\xd3\xa2\x69\x66\x4e\x48\xc8\x5a\xe3\xf2\x72\x23\x79\x18\x78\x5b\x53\x9c\x43\x39\x9a\xf6\xd4\x3c\xb7\xf7\xca\x69\xec\x80\xc2\x91\x37\x80\x2b\x23\xb0\x07\x36\x38\x25\xc6\xe0\x81\xa2\x28\xb5\xc8\xe7\xc8\xc0\x64\x37\x50\x93\x73\x35\x0e\xa6\xd4\x52\xb9\xf4\x65\xc4\x92\x02\x64\x0e\xe8\x5c\x38\x1f\x8f\xcb\x4b\x19\xe5\xe7\xad\xd4\xf6\x8a\x26\xff\xe2\xab\xab\xd3\xec\xa0\xe5\xfa\x2f\x2f\xcf\xd4\x83\x04\x53\xb3\xd4\xbe\xeb\x7b\x90\x30\xad\x45\x4d\xe1\x0e\xb3\x2d\xa1\x13\x50\xe5\x81\x8b\x3a\xbf\xf6\x82\x26\x0c\x80\xc5\x75\x33\x65\x0d\x78\xdc\x2b\x25\xbf\xd9\x03\x23\x59\x8b\x16\x87\x87\x4e\x10\x22\x92\xae\x50\x48\xe7\x23\x44\x82\x40\x01\x76\xf2\x7a\x64\x9a\xa3\x4c\xbd\x5a\x6b\x0a\xf1\xd4\x91\x39\xbb\x8e\x26\xb9\x7c\x7a\xf0\x2b\x23\xa2\xed\xa5\x10\xa2\x5d\x64\x07\x88\x0e\x05\xf2\xdd\xf0\xc8\x8d\xf3\x45\x2c\x3d\xb1\x42\xe9\x68\x8a\xef\x6f\xb0\x67\xde\xeb\x80\x31\xf8\x77\xfd\xdf\xf7\xe5\x54\xe4\xfd\x3d\x11\xe1\xbb\x05\x2f\xa5\x15\x9b\xd6\x71\xcb\x55\x7d\x35\xaf\x53\xc4\x05\x2f\xa1\x5c\x7b\x8d\x36\xad\xc2\xd5\x63\x5f\x50\x9b\x36\x1f\xfe\x0f\xd5\xa6\x4d\xaa\xb6\x26\xdc\xd7\xbf\xe7\x1a\xae\x5c\x1d\x98\x1d\x2f\xd7\xe5\x48\xc9\x1b\xe7\xe8\x0d\xfc\xd3\x47\xec\xc4\x37\x45\xa0\x0c\xdc\x3d\x7a\x22\x9c\x25\x0d\xfe\x0d\x7c\xd7\x7d\x9c\x09\x79\x92\x24\x1f\xeb\x44\x31\xfb\x91\x51\xda\x0d\xbf\x78\xd3\x4f\x6a\x87\xa3\x50\x90\x61\x46\xff\x33\x05\x23\xea\xb0\xc0\xa4\xb2\x93\x70\xbc\x2d\xe0\x99\x52\x9a\xe6\xa9\xc4\xcb\x3f\x4a\x96\x7a\x16\xa5\x28\x59\xea\x79\xac\x62\x0d\x59\x63\x4f\x72\x4f\x87\xbd\x1a\x5f\x9c\xe4\xdf\x53\x30\xc7\xf7\x88\x34\xfb\xca\x17\x09\xd8\x33\x46\xcc\xf6\xae\x5c\x07\x12\x06\xc1\x82\xe4\x3c\x98\x43\x11\x13\x29\x39\x1d\x58\x08\x05\xce\xc1\x18\xc1\xed\x5d\x6a\x47\x20\x51\xef\xc2\x98\x15\xcc\x00\xa0\x44\x94\xf0\x0c\x12\xce\xcd\x42\xd2\x35\xed\x03\xd2\x4c\x28\x9e\xcf\x35\x60\x78\xa0\xcd\x8c\x3c\x97\x30\xfb\x9c\x11\x09\xcf\x10\x0c\x3c\xdb\x6d\xc3\xd0\x1f\x07\x7d\x18\xb6\xe1\xc7\xc6\x0e\xb9\xe4\x42\x42\xc1\x18\x4a\xb8\x8a\xa9\x95\x4f\x98\x08\xf0\xf0\xb4\x4c\x2e\x01\xc9\xdc\x49\x91\xb7\x68\xce\xbd\x7b\x46\x90\x5a\xa2\xfb\x17\x6a\x01\xbf\x2b\x26\xe7\x1e\x16\x39\x50\x26\x20\x88\x6e\x90\x41\x20\x98\x75\x6d\x50\xad\x7f\x84\x85\x0f\x64\x8e\xd1\x61\x69\x15\x48\x45\xe8\xf5\xfd\x01\xdc\x6b\x37\xf1\x6a\xd4\xf7\x30\x5f\xe5\xf7\x2c\x44\xc8\x07\x8a\x1a\xf2\xf7\x0e\x1f\x3f\xd6\xab\x38\x34\x02\x50\x10\xbf\xcd\xb4\xd3\xe4\x94\xb7\xe8\xb4\x3f\xcf\x65\x65\x76\x79\x62\x42\x09\x5c\xc4\x33\xbb\xb1\xa8\x81\x21\x44\x39\x3a\xdf\x41\xa2\x34\xbc\x1e\x9d\x99\x7b\x02\xcd\x17\xce\x3e\x91\x6a\xc2\xc4\x18\x8f\x2c\xf9\x2a\x78\xc5\x27\xcb\x9e\x59\x57\x0a\x05\x4f\x58\xea\x01\x24\xeb\xab\x58\xee\x16\xe9\x94\xda\x24\x8a\x64\x1d\xe2\x48\x66\xcb\xf1\x60\x1d\xc3\xc2\x00\xaf\x67\x2e\x5c\xfe\x6d\xc4\x3e\x3d\x59\x08\xc0\xeb\xea\x64\x9c\x2f\x9e\xc7\x99\xa6\x9d\x3c\xcd\x13\x4e\xdc\xd6\x13\x47\x72\x3c\x79\x94\xe1\x04\x2f\xa3\xba\x3d\x50\xe7\xad\xb6\x28\xd7\x4d\xa4\x7a\x78\x76\x56\x14\x75\xe0\x7b\xb0\xa6\x78\xdc\x67\x1e\x5d\xc4\x53\x7d\x45\x45\x70\xc7\xf4\xde\xf7\xb6\x3b\xb1\x7a\x58\xb2\x3f\xfd\xf1\x09\x93\x64\xcb\xa1\x8a\xbb\x96\x48\x94\x7f\x0b\xb2\xe5\x3e\xe6\x63\xe6\xc5\x84\x7f\xb1\x89\x2b\x57\xd6\xdc\x27\x8b\x2b\x86\xfd\x7c\x91\x33\xce\x29\xf7\x86\x22\x80\xae\x81\x22\x1e\x3e\x41\x70\x0d\x54\x38\xb2\x3d\x49\xe1\xba\xe8\x31\x18\xdf\x81\x5c\xac\x0b\x64\x62\x24\xa2\x17\xbf\x91\x11\x74\xe2\x84\xce\x81\xe3\x3a\xe8\xdc\x94\x8e\x9c\xc1\x00\x7a\x12\x10\xfd\x79\x52\xb5\x61\xd3\x12\x3e\x12\xf1\xbb\xce\xc7\x21\x8b\x25\xca\xc6\x49\xdf\xa8\xa6\xa4\xc5\xd9\x31\x85\x00\x12\x96\xdc\xce\x83\x0a\xa0\x97\xa1\x79\xea\xee\x7d\x6b\x6b\x8b\x5e\xe9\xc3\xcd\x80\x4c\x3d\xd6\x25\xd4\xa3\x6b\x01\x85\x02\x50\x4e\x01\x3c\xec\x04\x06\xc8\xe9\xdb\x2e\xf3\xe7\xca\x35\x56\x25\x3c\x85\xcd\xad\x64\x30\xa7\x92\x41\x16\x87\x20\x07\x87\xe4\xf2\x3e\xb7\x19\xa3\x5d\x4a\xe9\x1e\x21\xfe\x02\x0e\x90\x88\x18\x28\xa6\x0d\xd2\x01\x88\x2f\xf8\x11\x53\x73\xee\xf8\xa3\x52\x10\xbf\x17\xcb\x35\x98\xd8\xf1\xcc\xe6\xf0\x92\xe8\xc4\xbc\xfc\x1e\x73\x13\xcb\x3d\x15\xcf\x20\x75\x38\x1e\xc1\x40\x62\x3b\xbe\x22\x9a\x30\x81\x26\x1b\x62\xc9\xfd\x59\xa8\x80\x0b\xde\x54\x86\x0d\xa8\x2a\xad\x11\x4e\x44\x9b\xaa\x6b\xc7\xa0\xd8\x9c\x45\x89\x2c\x45\x78\x0b\xf2\x52\x29\x4b\x36\x4d\x33\xe6\x03\x5d\xd8\xe3\xb6\x74\xfc\x9b\xc5\x8a\x23\x1f\x8b\x27\x20\x01\x14\x09\xe0\xef\xfd\x24\xb2\x13\xf8\x67\xe7\x39\xaa\x43\x2f\x78\x6f\x0a\xcf\x20\xcb\x50\x09\xc3\x3e\x3b\xe7\x2a\xc0\xa9\x5b\xca\xc8\x79\x41\x74\x9b\x1d\x81\x9c\x7b\xa5\xa1\x60\xb8\x50\xcf\x6c\xb9\xf1\x9b\xa8\x0a\x85\x6c\x5c\xe2\xba\xac\x75\xe9\xc0\xf5\x0f\x24\x43\xc2\x2b\x6b\x09\x84\x73\xf2\x5a\xcf\xde\x8c\x45\x4e\xcd\x1e\x6f\xfa\xc7\xb6\xe3\xf1\xcb\xb2\xc8\x56\x64\x56\xb8\xc5\xc1\xe2\x7c\x92\xba\xf9\xcb\x39\x94\xcb\x1a\xee\x1a\x44\x29\x0d\x8d\x43\xe2\xab\x99\x20\x85\x05\x15\x25\x90\xc3\xe8\x72\x30\x61\x9f\xd2\x22\x22\xf5\x1d\xc7\x85\x6d\x68\x0f\x60\x50\xb3\x54\x7b\x30\x68\x9c\x40\x8f\xb8\x65\x87\x1e\x0c\x64\x09\xa3\x22\xe5\x18\xd8\xe0\x75\x7f\x00\xc3\xb1\x8b\x94\x09\x58\xd4\x15\x90\x97\x98\x69\x07\xe6\x09\xfb\xb2\x15\xa5\x0b\xa0\x3d\xb0\x42\x7e\x4d\xa0\x80\x2a\xdd\x13\xf5\xe8\x24\x80\x5f\xc5\x8a\xe0\xe1\xae\x4c\x40\x18\x89\xfa\x1e\x7e\x1f\x41\x4f\x96\xee\x36\x3a\x12\x40\x45\x69\x7d\x1c\xb8\x66\xae\x5c\x6f\x29\x45\xa9\x20\xde\x97\x66\x4a\x45\x5b\x01\x94\x66\x8b\xa6\x69\x17\x0a\x73\x08\x5e\x28\x88\x78\xe0\xd4\x36\xee\xfb\x64\x75\xc1\x6e\xa1\xe4\xee\xe0\x93\xa1\xb5\x50\x45\xf4\xcd\xf4\x09\xe6\xfc\x2b\x4b\x5f\x52\xeb\xc9\x04\x2f\xce\xbc\x81\xfc\x02\xeb\x0b\x2a\x6e\xb1\x21\x6b\x87\xa1\x33\xf4\x2e\x2f\xf3\x6f\x36\xd0\x6b\xf0\x56\xe6\x62\x14\xc8\x65\x36\xc1\x99\x66\x17\xf6\xe2\xab\x43\x16\x1c\x6f\x01\x29\xac\x80\x58\xb7\xf2\xc8\x0e\x5b\xa7\x1e\xe7\x0e\x54\x8b\x11\x8b\x5b\x85\x82\x6c\x75\x83\x9e\x89\xba\x41\x2f\xbe\xec\x73\x02\x3c\x33\x94\x91\xac\x2f\x91\x9b\x06\xc8\xeb\x32\xbb\x6a\xa0\xbc\x2a\x28\xae\x84\x2f\x75\xc7\x40\xfa\x56\x67\xc6\x09\x2e\x2f\x2f\x26\x20\x4c\xdd\x61\x24\x1d\xf8\xbe\x0b\x6d\x2f\x56\x53\x46\x64\x8f\xc9\xf1\x86\x97\x97\xd1\xab\x52\x0b\xe9\x96\x93\xa8\xd2\xa9\xab\x9a\xaa\x95\x6c\x77\x74\x64\xab\xba\x2e\x71\x57\x9c\xa9\xfd\x63\x22\xca\xf8\x33\x38\x95\xb4\x13\xf8\x27\xce\x00\x0e\x16\xd8\x0e\xcf\x82\x13\x2e\x60\x21\xf0\xd4\x41\x47\x8e\xb7\x60\x2f\xf0\x6c\x24\x7e\x6c\xe5\x8b\x27\x28\xa0\x6f\x5e\xd8\xe1\xb9\xd7\xc7\xcb\x29\xdb\x75\xfd\xd3\x8e\xed\x78\xc8\x58\xd4\x41\x5a\xcb\x45\xfa\x8f\x87\xe4\x3f\x09\x88\x7d\xd0\xd0\x97\x60\x05\xb0\x5a\xe2\x4c\x08\xb7\xa4\x07\x33\x6c\x5e\xa3\xfe\x36\x61\x80\x63\x13\xdb\x1f\x6d\xb2\xe1\x46\xd2\xe9\x80\xec\xeb\x18\x8e\x3a\x80\x27\x4e\x1f\xee\x38\x67\xd0\x6d\xdb\xc8\xf1\x2f\x2f\x75\x80\x88\x11\xb1\x91\xf4\xd8\x8d\xb8\xbd\x2f\x18\x87\x10\x33\x46\x9c\x8b\xb0\xaf\x66\x38\x82\x4f\x7f\x20\x6e\xa4\xf1\x18\xb6\xad\xc6\xb6\xd0\x0c\x47\x3c\x43\x62\xa1\x4f\x58\x28\x3b\x45\x9a\x00\x17\xaf\xfd\x6c\x95\xee\x15\x32\x51\x14\xaf\xfe\x02\xf9\x62\x02\xfa\x64\x77\x24\x5a\x56\xb9\x93\x9a\xaf\x52\xf3\xf9\x36\xdb\x5b\x34\x23\xfc\x81\xa5\xc2\xb3\x91\x1f\xa0\xd0\xf4\x5f\x85\xc6\x9a\x80\xdf\xcc\xf5\x57\x7a\x65\x13\xd9\xcf\xa4\x0c\xa0\x63\x4b\x19\xe7\x50\xde\x3d\x3f\x3e\xf0\x5d\xd5\x41\x30\xb0\x91\x4f\xc6\x31\x45\x50\x00\xcc\x1b\x3e\xe4\xd6\x93\x45\x0d\x78\xe6\xa2\x1e\xaf\x56\x51\x70\x1e\xb1\x12\x1b\x84\xa6\xd5\x4d\xe5\xdf\x93\x95\xda\xa2\x1c\x98\xb2\x6d\x86\x89\x55\x2d\x66\x09\xec\xe6\x14\x9b\xae\x6b\x15\xb0\x08\xc9\x98\x23\x2c\x68\xd1\x24\x0e\x87\xf1\x22\xaf\x16\x5f\xbf\xec\x61\x14\xea\xa6\x35\x39\x74\x3c\xdb\x75\xcf\xc9\x95\xc3\x8b\x41\xa1\x80\x59\x30\xc6\x3d\x7e\x93\x95\x08\xc8\x39\x94\x3d\xb6\x98\xa8\x47\x0b\x42\x34\x21\xd5\xab\xe5\xae\xc5\x9a\xde\x89\xed\x3a\x83\x05\x1b\x21\x78\x3c\x42\x0b\xc8\x5f\x18\xc0\x10\x05\xe3\x3e\x1a\x07\x70\xc1\xf3\xbd\x12\xa9\xe1\x81\x0b\xa3\x99\x01\x73\x68\xb2\x5a\x94\x1f\x70\x46\x86\xe4\xf2\x1a\x61\x6d\x38\x64\x49\x27\xac\x0d\xbf\x96\x2b\x44\x91\x8f\xc0\x69\x44\x93\x8f\x1c\x6a\x3b\x26\x92\x97\xaa\x0a\xe8\xe3\xcf\x25\x05\xb8\xf4\x8e\xb9\xb1\xf9\x40\x76\x05\x6e\xf8\xe0\x25\xd4\xf8\x92\x3d\x29\x65\x1b\xf2\x40\x61\xd7\x22\xa4\x0e\x69\xc1\x1e\xd3\xd9\x63\x27\x67\x88\xef\x53\x03\xfe\xf6\x84\xac\x71\xe2\x4d\x70\x94\xd8\xea\x56\xc0\xd0\x3c\x55\xb9\x88\xce\x0a\x27\x42\xcf\x38\x1a\xff\x19\x3d\x8f\x4c\x02\x25\xbd\x47\xad\x18\xae\x4a\x34\x5f\x77\xac\x76\x63\xbb\x03\x36\xcc\x53\xb2\x5a\xbc\x3e\x67\x0c\x75\x6d\x76\x03\x13\x9a\x66\x0e\xde\x43\xd5\x09\x89\xb6\x2c\x3d\xce\x94\x95\xf5\x8d\x4c\x08\x4a\x67\x9e\xc2\x29\x13\x4f\x2f\x64\x34\x36\x8c\xa1\xf1\x2e\xd3\x72\x07\xdb\x48\xcd\xe7\xca\xeb\xd9\xe3\xe3\xdc\x3b\x70\xf3\x6e\xd5\x4d\x1f\x2e\x84\x51\x7f\x0b\xd7\xe5\x31\xd3\x48\xe4\xbd\x65\xc3\xc5\x42\x17\xed\x50\x60\x51\x03\x96\xa2\x30\xdd\xab\x3b\xbe\x87\x42\xf9\x34\x9d\x5b\x94\xd9\x98\x94\x39\x0e\xfa\x70\xcb\xc7\x32\x27\x11\xfe\xce\xe5\xec\x1d\xc3\x8a\x20\xa2\xc6\xaa\x65\xe3\x4c\x8f\x01\x01\x6e\x3f\x61\x7e\xf4\xcc\x20\x31\x2d\xd4\xd9\xf7\x13\x3e\x4d\x98\xd2\xbd\xce\xfd\x2d\x89\x68\xbc\xb0\x0b\x83\x2e\x2f\xa5\x7a\x6b\xf3\x49\x22\x8c\xaa\x51\x90\x85\x14\xaf\x36\xb9\x2b\x44\x3e\x65\xca\x11\x89\xa3\x6b\x48\x9c\xbc\x03\xc7\xe4\xea\x8d\x7d\x93\x9f\x95\x01\xd7\x64\x56\x94\x7b\x26\xd1\x3f\x8a\x2f\x20\xa2\x43\x55\xce\xe8\xa7\x0e\x00\x3d\xf4\x32\x1e\xb0\x59\x16\xb1\x23\x95\x33\x23\x73\x37\x08\x52\xcf\xd6\x91\x7a\x66\xb8\xe0\x3c\x2f\xf2\x7c\x1d\xa9\xe7\xc6\x1e\x20\x58\xe5\x01\x90\x88\x75\xf6\x6b\xc4\x86\x9e\x8e\x02\x28\xfe\x79\x89\x98\x5a\x1b\x7f\x11\x92\xf5\x95\xc4\x94\x9e\xe4\x19\x89\x39\x3d\xc9\x40\xa2\x49\x3d\xe6\x3c\x7c\x42\x8f\x38\xd0\x84\x29\xa6\x38\x54\xfb\xe0\x11\x49\xae\xc8\xa7\x60\x0f\xd0\xae\x68\xe5\xdc\x54\x4d\x45\xde\x40\xb6\x00\xd9\x49\x86\x5d\xad\x07\x42\x13\x76\xf5\x1e\x70\x4c\xd8\x2d\xf7\x98\x46\x33\x51\x47\xd8\xf6\x07\x70\x07\xb7\x6b\xa0\xc8\x21\x70\xc0\x03\x85\x34\x5a\x52\xbc\xe3\x3e\x2d\xc9\x45\x38\x7d\x2e\x2c\x65\x2e\x78\xc9\x39\x93\x7b\x19\x70\x33\xc1\xaa\x14\xe0\xf0\xa1\x32\xab\x8a\x78\xa4\xf4\xc5\x0d\x4b\x79\x8f\xab\x03\xec\xcd\x1d\x21\x4e\x6a\x84\xb8\xf1\x08\x09\x73\x46\x48\xf8\xee\x46\x48\x08\x3c\xe0\xe0\x69\xc2\x65\x23\x64\xc3\x74\xf9\x08\xb9\x63\xba\x74\x84\x34\x4c\x97\x38\x58\x38\xcc\xea\x6c\x0f\x80\x60\xbf\x6c\x40\x2a\xd3\xee\x22\x3f\x80\x86\xf5\x2e\x86\xcb\x9d\x79\xc3\xa5\xf1\xf2\xc3\x65\xf8\xee\x86\xcb\x86\x32\xa9\x65\xe4\x37\xa4\x52\xf9\x59\x49\xaf\x21\xc8\xda\x8a\x45\xce\x72\x53\x96\xb2\x76\x02\x87\x0a\x67\x33\x63\x65\xc2\x34\x75\x8e\x52\x4b\x22\x9e\x67\x02\x98\xf5\xf3\x45\xb2\xe7\xa4\xa6\x96\x06\x85\x82\x2d\xe8\xfa\x24\xbf\x52\xea\x8b\xe0\x08\x8f\x5b\x3a\xca\x5e\xc9\x31\x59\x3c\x68\x93\x72\xb3\x23\x23\xb9\xa2\x11\xcb\x0a\x27\xba\xdb\xce\x11\xee\xb6\x2b\xeb\xf4\x72\x3b\xbd\x4a\xe5\x31\x71\xfd\xe9\xbc\x84\xc4\x25\x20\x90\xa7\x70\x45\xef\xa4\x4c\xae\x85\xe8\xcd\x6f\x00\x82\x7a\xb1\xa8\xb0\x25\x6a\xa4\x14\x2a\xdb\x34\x16\x0b\xc2\x7c\x65\x22\x5b\xc0\x06\x21\x20\x7e\x58\xc2\x09\xbb\x8b\xb2\x2b\xed\x6e\xb4\x9b\x3b\x1d\x09\x48\xf7\x1a\xd6\xa6\x04\xa4\x4e\xb3\xb3\xd5\x90\x80\x44\x27\x7c\x09\x48\xf5\x36\xfe\xda\xe9\x34\x5b\xdb\x52\x4f\xd0\x82\x62\xf2\xa0\x03\x5c\x70\x1a\xef\x0d\xec\x81\xa1\x09\x05\xd5\xaa\xda\xb0\x36\x34\xf7\x94\x8b\x3d\x73\x48\x44\xf9\x5d\xe7\xc0\x75\xbc\x61\x8d\xea\xe0\x0d\x67\x2b\xfa\xe1\x4e\x3d\x14\x77\x50\x36\x88\xee\xe5\xe5\x65\x22\x90\x06\x6d\xb0\xbe\x53\x28\xa4\x52\xd0\x60\x92\x50\x19\xaa\x03\x1b\xd9\x69\xdd\xbd\x42\x21\xab\x5b\x3b\xe3\x9e\xa9\x21\x40\x4c\x49\x6f\x21\x8b\x1b\xe6\x77\x4c\xa2\x48\xa1\x98\x88\xb9\x0e\x53\x01\x58\xa1\x17\x14\x9a\xa6\xd9\x8f\x2e\x28\x1c\xaa\x9e\x3f\x80\xf4\x86\x42\xa6\x29\x98\xec\x15\x43\x80\x70\x7b\xb0\x9b\x7b\x07\xaa\x13\x3e\x74\x42\xe7\xc0\x85\xb2\xa2\x5c\x48\xc4\xae\x05\x73\xe0\xa1\xc8\x81\xed\x1c\x03\x0e\x45\x1e\x82\x81\x62\x48\x9d\xc6\xe3\x8e\xd5\x6e\x58\x33\x13\xa5\x74\xec\x79\xba\xdd\xc6\x16\xee\x3d\xb3\x52\x25\x14\xec\x59\x9a\x41\xfa\x56\xc4\x42\x21\x13\x94\xbc\x88\x6c\xd1\x34\xfd\x8c\xdb\xcc\xed\xd6\x76\x83\x5c\xfb\x11\xe6\xdf\xc9\x48\x4a\x03\x6c\xaf\xf7\x8e\x19\xd7\x70\x51\xc0\x15\x34\xcc\xb1\x3c\x00\x43\x42\xc5\xc6\xe5\xe5\x03\x79\xc0\x08\x7e\x68\x36\x2e\x2f\x31\x5d\xb9\x51\x21\x1c\xc8\xca\xba\xa3\x0e\x21\x6a\x43\xdb\xdd\x21\xcd\xb8\x8b\xec\xfe\x53\xc7\x1b\x72\x95\x29\xc5\x70\xc0\x51\x6a\x84\x0e\xc0\x21\x68\x28\xb5\x43\x32\xa1\xc3\x33\xc4\xfa\xde\x91\x02\xee\x14\x0a\x16\x41\xf2\x88\x0c\x2d\xba\x87\xe9\xd0\x5e\x1a\x40\x76\xae\x3b\x10\xe0\xe8\x10\x9c\x30\x6b\x88\x6c\xdf\xdc\x7d\x78\x77\xf7\xe1\xdd\xfc\xde\x99\x8a\xbb\xae\x7f\x26\xc0\x29\x45\xee\xcd\xec\x82\x60\x64\x8e\xe5\x7b\x8c\x8a\x23\x4c\xc5\x7b\x8c\x8a\xdb\xe6\xe8\xf2\xf2\xde\xbb\xa0\x62\x33\x45\xc5\x7b\x60\x1b\x8c\x94\xda\x76\x8a\x8a\xcd\x19\x54\xbb\x47\x0c\xcf\xc7\xa9\xbd\xbe\x48\x9a\x76\xc2\xb6\xef\xf3\x6e\x29\x2b\x97\x97\x56\x02\xc5\x47\x0e\x3a\xfa\x30\xb1\xf2\xa0\x71\xec\x54\x9f\x7a\xe4\xb8\xa5\x53\xf0\xc8\x46\x12\x57\xe9\xf2\xf2\x94\x14\x31\x01\x0f\xf2\xad\x3c\x92\x14\xa0\x39\x90\x7b\x06\x89\x56\x55\xfa\x2e\xa8\xc8\x10\x2b\x5e\x6b\x70\x7e\x80\x27\x18\xda\x46\x62\xbb\x45\xad\x12\x47\x5f\x2b\x36\xa6\xd7\xa9\xaf\x46\xc1\x14\xcc\xd2\xb4\xfc\xff\xb4\x56\x00\x55\x47\xa9\xc9\x01\xd1\x45\x09\x52\xba\x28\x6b\x19\xa7\xb3\xff\xca\x9e\x39\xa2\xb5\x06\xb7\x35\xa0\x7d\x22\x72\x51\xc7\xc6\x1c\xb9\xf9\x9c\x04\xb0\xc1\x16\x05\xa0\x00\xda\xc8\x0a\xf1\x98\x4e\x8d\x66\x33\x98\xc4\x07\x39\x5c\xdf\x60\x38\xdb\xbf\x4d\xd2\x7b\x24\xc5\x63\x3d\x89\x64\x72\x3c\xde\x10\x00\xd5\x38\x63\x99\x3b\x39\xcc\x4f\x25\x9e\xb9\xce\xe4\x44\x33\x91\x5b\x14\xca\xbc\xbc\xbc\x86\x02\x04\x7b\x23\x85\xe5\x1c\xee\x97\xa7\xf4\x68\xbf\xd7\x63\x33\xce\xfa\x5f\xd1\xba\x85\xb9\x56\xa2\x1f\x4c\x17\xe2\x3d\xbf\xfc\xfa\x8f\x9d\x0d\x2d\xd3\x15\xcc\xca\x0b\x99\x41\xd5\xb2\x47\x64\x00\x25\x16\x8c\xa1\xe0\x1e\xe3\xac\x28\x43\xf5\xac\x64\xa9\x67\xca\x0d\x44\x3c\x87\xca\x50\x3d\x27\x7e\x88\x6f\x20\x65\x02\x9c\x79\x0c\x0e\x78\xef\xaf\x25\xd5\xf9\x08\x9a\xf5\xac\xcb\x55\xd1\xdf\x90\xe8\x12\x88\xb9\x4f\xe5\x2c\x30\x76\xa8\x6a\x06\x51\x88\xe9\xe5\xf0\xb6\x70\x7c\x30\x70\x4e\x9c\x1c\x4f\x88\x82\x86\xaa\x2f\xc7\x25\x65\x0b\xa5\xf6\x53\x22\x0c\x8f\x48\xe1\x82\x01\xeb\x1c\x50\x08\xe6\xdf\xc4\xfa\xc4\xf4\x89\xcf\x4e\x88\x3b\x80\x2f\x7b\xa0\x8e\x5f\x1d\xd3\x97\xc9\x2a\x31\xf6\x74\xb6\x2e\x38\x49\xa2\x88\x05\xc0\x06\x8e\x62\xd0\x70\x07\x84\xa0\x1e\xe5\x2c\x3a\x6d\x23\x7e\x11\x67\x33\xf2\x84\xef\xa5\x41\xa6\x0a\x33\x2a\xc9\xfd\x32\x65\x79\xa1\xf3\x8a\x2c\x0c\x13\x46\xf1\x29\xbd\x94\x7f\x3f\x58\xfb\x37\x7e\xb0\x56\xa7\x5e\x87\x6c\x33\x47\xe4\xca\x61\x71\x21\xf5\x22\x54\x22\x2e\x83\x00\x79\x4d\xba\x13\x4a\x7f\x26\x7d\x0b\x5d\xe3\x3f\x61\x21\xcc\x38\x18\xe2\xd6\xe4\x59\x8f\x42\xd4\x89\x45\x49\x2a\xc2\xa2\x54\xa2\xee\x6c\x25\x85\x5a\xee\x11\x8f\xa6\x24\xab\xe8\x5c\x83\xa9\xb4\x29\x20\x30\x3d\x19\x01\x62\xec\x1a\xd0\x8d\xea\xa0\xab\xf7\x32\x2a\x60\xe1\x7a\xb7\x0e\xea\x3d\xa3\x5b\x07\x61\xef\x15\xfa\x2b\xda\x6c\xee\xee\x6c\x59\x4f\x98\xcb\x19\x1d\xd4\xb7\x5a\x1b\xaf\x19\x65\xd0\xdc\x26\x6e\x2d\xab\xa0\xbd\xb7\xbd\xdf\xdc\x36\x56\xc1\x9d\xad\xd6\x23\x43\x5f\x26\xbf\xfb\xed\x56\xab\x63\x54\xca\xa0\x63\xd5\xb7\x1a\xc6\x72\x15\xdc\xd9\x6a\x3c\x36\xf4\xf2\x2a\xb8\xdb\x6e\x6e\x1a\xe5\xa5\x65\xd0\xde\xab\x3f\x31\x96\xf4\x32\xd8\xdd\xab\x93\x40\x5d\x2b\x57\x01\xd9\x0d\x68\x76\x1a\xf7\x8d\xb2\x56\x5d\xa5\xe9\xf7\xdb\xad\x47\xfb\x77\xdb\xad\xbd\x1d\xa3\xaa\xad\x2d\xb3\xc0\x7b\x0d\x6b\x93\x5c\xae\x88\xc3\x57\xf5\x35\x56\xd8\xfe\x9d\x56\xab\x13\x85\xeb\xcb\x95\xd5\x6a\x9c\x8b\x51\x29\xaf\x2c\xf3\x5c\x37\x1a\x5b\x5b\xc6\xf2\xd2\x52\x85\xe7\xb8\xd1\xda\xda\xbb\xbf\xcd\x53\xde\xba\xa5\xaf\x24\x22\x48\x50\x94\xd8\x22\x1b\x6a\x24\x6c\x8d\xd4\x65\xbf\x4e\x1c\xf1\xdc\xba\x55\xd6\xe8\x77\xa7\xf1\xb8\x43\xbe\xf5\x38\x7e\x7f\xa3\xb5\xdd\xb1\x9a\xdb\x8d\x36\x89\x29\xc7\x90\xa9\x98\x0a\xc0\xdf\x8d\xed\xce\x2e\xf9\xac\x32\x82\xef\x53\xfa\xe3\xa0\x25\x1e\x14\x93\x0c\x07\x2f\xf3\x60\x4a\x7a\x1c\xb4\xc2\x83\x68\x23\xdc\xba\x55\x5e\xe5\x21\x94\xf0\xb7\x6e\x95\xd7\x26\x22\x37\x4c\xac\xaa\x2f\xe7\x79\x9e\x72\xfd\xfe\x53\xd1\xe9\x14\x46\x8f\x3a\x00\xa2\x9b\x37\x42\x1c\x2d\x92\x46\x06\x63\xaf\xe4\x78\xa2\xaf\x26\xd2\x8d\x98\x23\x26\xd7\x3f\x15\xfd\x30\x6d\xb5\x1e\xc5\x11\xa5\xc0\xf7\x51\x2a\x96\x74\x37\x0a\x42\xe4\x30\x21\x9a\x50\x81\xa7\x86\x67\x89\x84\x8d\xc7\x34\x62\x18\x38\xa2\xdf\x27\x4c\x13\x8e\xe5\xc1\x79\x02\xc7\xfa\x13\xe6\x0f\x6a\x7c\x90\x4a\xc4\x3a\x31\x73\x8f\xe4\x84\x08\x73\xb4\x63\xd1\x3d\x12\x6f\x25\x01\xcf\x52\xe0\x9f\x96\xf0\xca\x7d\x94\xc6\x38\xee\xf2\x22\xf8\x11\x51\xd2\x9b\x91\x42\x1c\x0f\x62\xa2\x43\xdf\x47\x33\x13\x89\x83\x25\x85\x58\x1e\x4a\x22\x48\x1f\xba\x6e\x06\x06\x8f\xa9\x04\x90\xef\x8e\x8f\xbd\x19\x85\x8b\xe3\x2d\x9b\x68\x06\x78\x02\xd0\x26\x16\x92\x59\x48\x3a\x38\xe3\x46\x2c\x1d\x24\x7d\x55\x45\xe3\x51\x00\x21\x0b\xc3\x14\x08\x1e\x98\xa9\x5c\x4a\xd1\xc2\x33\x2f\xbf\x78\x14\xa7\x72\x9e\x9d\x2c\x39\xf8\x99\xf3\x2c\xbc\x66\xf4\x50\x28\xba\xce\x62\xec\x40\x1c\x5c\xa5\xf4\xf0\x13\x99\x44\x02\x30\xaf\x47\xa6\xd9\x47\x22\x41\x7a\x1c\x89\x4c\x25\x01\x98\x1a\x55\x02\xa7\x49\x80\xa5\x86\x8b\xc0\x7e\x52\x9e\xc0\x64\xa8\x44\x2e\xcb\x36\x9d\x70\xe4\xda\xe7\xf9\x3b\x6f\xc2\x4c\xca\xee\x4a\xf7\x80\xf6\xea\x26\xc2\x3b\x5b\x2d\xab\x13\x7b\x5e\x6b\xdc\xe9\x18\x3a\xf3\x68\xc8\x67\xc3\xfd\xdd\x8e\xd5\xee\x18\x15\xfe\xd9\xd8\xde\x14\x9c\xd8\x6d\xec\xee\x92\x8d\xc1\x79\xae\xd7\x88\x34\x22\xf0\x8c\xc6\x1d\xde\xfd\x88\xd4\x22\xf4\x1c\x5c\x70\x82\xc0\x44\xae\xce\x52\x98\xa0\x94\x00\x84\x5e\x4e\x43\x34\xb6\xd3\xed\xf0\xde\x6f\x4c\x10\x2a\xdc\xf1\x3d\x94\xd3\x9e\x17\xb1\xf2\xbb\x91\x30\x6c\xe0\x3a\xf0\x86\x60\xd0\x10\xb9\x94\xe7\x81\xc4\xbd\xbc\xe0\x5c\x9e\x85\x73\x57\xf3\xb1\xa3\x79\x63\x0e\xed\xb9\x7f\x44\x46\x86\xaa\xa6\x51\xb2\x1d\xf8\x6e\x4c\xb0\x15\x4d\x9b\xd0\xb3\x76\x52\x9b\xa6\x87\x64\x0b\xe8\xf1\x21\x9d\x13\x6e\xdb\xdb\x32\x54\xd6\xab\x9a\x66\xc0\x89\x6c\x09\x5e\xee\x5f\xc1\x55\x5f\x8c\xa8\x5b\xa2\xf3\x8f\x04\x75\x9d\x43\x99\x57\xcc\x34\x4d\x8b\x2f\x49\xe8\x02\x88\x55\x82\xf4\x4a\xd9\xca\xd6\x41\x7b\xef\xbd\xbe\x44\xc3\x89\xf2\xa9\x76\xc3\x7a\x2d\x72\x82\x19\x99\x68\xec\x76\xda\xcd\x8d\x8e\x21\xb1\x42\xa2\x11\x14\x19\xef\xcd\x1b\x42\x2c\x91\xe8\xaa\x11\xe7\xf6\xaf\xe3\x03\x93\x2f\x41\xef\x53\xd3\x9b\x77\xeb\x4f\xf5\xa5\xfc\xa3\xb2\xb2\xde\x5b\xf7\xa8\xd4\x76\xe8\x7d\xf3\x8e\x6a\x5e\x3c\x6c\xee\x36\xb1\xfc\xaa\x81\x7b\xcd\xcd\xcd\xc6\xb6\xa1\x83\xdd\x8d\x76\x6b\x6b\xcb\x28\x03\x6b\xaf\xd3\x12\x1c\x5b\x72\x2f\xa9\xf3\x7a\x05\x33\x16\x8b\x1b\x9c\xe6\xca\xa4\x39\xa2\x5b\x24\x76\x19\x52\x12\x73\x1b\x3a\x46\xbe\xe8\x32\x74\xaf\xd3\xa2\x11\x27\xf4\x5c\x36\xa7\x33\x31\xdc\x5f\x59\x6f\xea\xc0\x33\xb4\x4b\x2e\x84\xc8\xf6\xa8\x17\xb4\xb2\xa1\x3d\xea\xe6\x47\xe4\x6e\xb1\xd4\xbb\x7c\x7d\x70\xf9\xba\xaa\xfc\xc9\x4d\xa7\x96\x2d\x21\xcb\x4d\x3c\x48\x78\xc9\xe5\x25\x19\x6b\xde\x30\xd6\xa2\x8f\xf8\x0b\x51\x55\x8c\xad\x0d\x24\x09\x20\x73\x51\x07\x81\xd9\xed\x51\xcb\xd7\xd0\xd4\x80\xff\xff\xb2\xf7\x2e\x6a\x6d\xe3\xda\xe3\xe8\xab\x80\xcf\x6f\x67\xac\x89\x08\x49\x08\x2d\x75\xaa\xe6\xc8\x4e\x02\xe1\x12\x08\x90\xb6\x34\xcd\xee\x67\x12\x61\x3c\x04\x9b\xb1\x1d\x0c\x43\xf2\x1c\xe7\x51\xce\x03\xfc\x5f\xec\x7c\x92\x7c\xb7\x73\x83\x74\x66\xef\xf3\xeb\x7c\xdf\x54\x58\x97\x25\x69\x69\x69\xdd\xb4\xa4\x20\x16\xe2\x10\x73\x26\x92\xc8\x0f\x84\xd5\x2c\xee\xd0\x88\x30\x29\x02\x80\x64\x26\x22\x57\x08\x7b\x3d\x67\xb3\x04\x69\x3f\x53\x38\x88\xf9\x74\x02\x70\xde\x0f\x55\x98\xb9\x9c\x77\x92\xf8\xc2\x7e\xc5\x43\x32\xa1\xf7\x33\x1d\x12\xb5\xb6\x27\x93\xa2\xf7\x7d\x25\x51\xb3\x9b\x7e\x5f\x8f\xc6\x96\x64\xf5\xca\xf4\x63\x0a\xa0\xc5\x14\x8f\x01\x61\xd7\x89\xbd\xb7\x77\xbc\xa9\x4c\xe1\x08\x15\xab\xa3\x8f\xfe\x33\x6a\xd5\x91\xef\x67\x1e\x23\xdc\x1b\xf5\xab\x1e\x51\x8e\x3d\xa2\x14\x05\x89\xe4\xd1\x18\xda\xf9\x7c\xe4\x87\x1d\x04\xe0\x67\x6f\x6d\x45\xb3\xa1\x20\x71\xc3\x5f\xd4\x45\x00\x07\x22\x00\xac\x5a\xb4\xca\x86\x5f\x45\x17\x63\x85\xfe\xc2\x47\xdf\xf8\xca\xe5\xd4\x82\x43\x6c\x47\x1c\x33\xdf\x11\x73\x5d\xd3\x26\x81\x47\xc7\xeb\x05\x16\xd9\x4f\x5a\xf9\xbf\x9b\x32\x1e\x8d\xa4\x9f\x71\xf5\x98\x93\x5d\xf0\x3c\xed\xdb\x38\x65\x06\xef\x8b\x4a\x3a\x2f\x84\x84\xfd\xc8\xe2\xb6\x78\xaf\x3a\x96\xfe\x34\xe1\xc9\xce\x10\x7c\x17\xc5\x42\x1e\x7c\x07\xdb\xd0\x0c\x9f\xe3\xca\x7c\x37\x97\x13\xb7\xce\x00\x7a\xe5\x93\x09\x2e\xb8\xe4\xfa\x4e\x0f\x9f\xda\xa5\x59\xf7\xe6\x5f\xf1\x6f\x3b\xf6\x69\x06\x5f\xe1\xf5\xee\xf1\x68\x44\x57\x8b\x63\xfc\x25\xe8\x40\x22\x30\xf8\xdb\x7b\x77\xd4\x8c\x0e\x80\xe7\x65\x0c\x23\x2c\x88\x0e\x26\x92\x6b\x67\x64\x9a\x89\xbc\x38\xe7\xe7\x0c\x21\xcd\x04\x22\xd1\x88\x91\x3b\x37\xc5\xe0\xe5\x8c\x1e\x81\xa4\x3f\xf5\x3d\x67\x09\x8f\x98\x9c\xf4\x88\xf9\x8d\x82\x1f\xa8\xe8\x4f\x41\x94\x69\xac\xcc\x97\xfc\xfb\x96\xf7\xcc\x0d\x6a\xb3\xe0\x06\xef\x8d\x53\x4e\x04\xec\x60\xbe\x57\xea\x07\x97\x88\x7a\xe5\xbe\x3f\x4c\xe8\x3b\xee\xd2\xe3\xca\xfa\xe1\x0c\x3e\x4d\x6b\x01\x08\xe6\xe8\xa3\xfc\x06\x5a\xb4\xa1\xd5\xdb\x65\x9f\x65\xf6\xef\x4e\xbf\x3f\x8d\x0c\xff\xa7\xc9\x5e\x26\xb5\x5a\xc7\xad\xcb\xab\x4c\xe9\xab\x9c\x1e\x1f\xe3\xb3\x8b\x86\x54\x0e\x04\xef\xe7\xf0\x36\xf6\x6b\x45\xef\xc0\x1c\x8d\xd4\x87\x98\x6d\xee\x77\xf4\x4f\x49\xd9\x00\x21\x5f\x4e\xcf\xeb\xb3\x54\x54\xfe\xd4\x03\x3e\x3e\x96\xbc\x97\x1e\xd4\xd1\x48\x80\x47\x8d\xc6\x19\xcf\xbc\x23\xe4\x81\xe5\x05\xc8\xfa\xe2\x3f\xfe\xb0\xf8\x21\x77\x35\xa6\x8c\x04\x5d\x71\x84\x04\x90\xc3\x1a\x7e\xb7\xff\xd0\x3b\xef\xde\x04\x79\x60\x4d\xd6\x23\x95\x4c\x85\xa2\x5b\xd3\xa3\xf7\x17\x9a\x21\x11\xc8\x1c\xe4\x12\xa9\x15\xa5\xb8\x31\xf5\xb3\x96\xd4\x11\x4b\x3b\xff\xbf\x78\x15\x05\x39\x62\xe5\xfd\x9c\x99\x44\x5e\x39\x59\xb2\x27\x23\xfa\x32\xca\x74\xfa\x13\xae\x85\x47\xe0\x07\x2f\xab\xb3\xef\xd3\x87\x07\xd3\x72\xc6\x86\xee\xe8\xc4\x46\x91\x07\x58\xb0\xc3\x29\x8a\x14\x06\x01\x8a\x2f\x4d\xe5\x56\xb5\xd4\x81\x43\x2c\x65\xa4\xda\x36\x6b\xd1\x35\x74\x5a\xe3\xd2\xd2\x09\x22\xe1\x7e\x39\xfd\xd2\xa8\x07\xdf\xed\xd3\xcb\x54\xde\x09\x6e\xd7\xf1\xe5\xe9\xf9\x15\xed\x22\x80\x76\xdc\xb8\xbc\x6c\x9c\xff\x68\x77\x4f\xe4\xc6\xf9\x8f\x93\xd3\x7a\xab\xd9\x6a\x9c\xcf\x39\x38\xfc\xdf\x13\x74\xf0\xeb\xb4\xf4\x3f\xfc\xb4\x54\xa5\x9c\x61\x8f\x87\xb4\x57\x3e\x50\xbb\x44\xb4\x90\x3d\xff\x81\x5c\xdd\xe3\x8b\x3c\x9e\x7c\x26\xfd\xef\x16\xe1\x08\x95\x8a\x70\x8c\x4a\x3b\xb0\x83\x4a\xbb\xd0\x45\xa5\xf7\xb0\x8b\x4a\x7b\x50\x43\xa5\x0f\x50\x41\xe5\x22\x1c\xa2\x72\x09\x36\x51\xb9\x0c\x1b\xa8\x5c\x81\x37\xa8\xbc\x0b\x6f\x51\xf9\x1d\x3c\x40\xe5\xf7\xf0\x01\x95\xf7\x60\x1b\xed\x14\x61\x0b\xed\x94\xe1\x11\xda\xd9\x81\x97\x68\xa7\x02\xef\xd1\xce\x2e\x7c\x44\x3b\xef\xe1\x33\xda\xd9\x83\xd7\x68\xe7\x03\xbc\x40\x95\x22\x3c\x46\x95\x32\xfc\x41\xf5\x70\x7f\x83\xbe\xc8\x47\x54\x1b\x39\x97\xca\xf0\xb8\x29\xed\x40\xe5\x44\xaa\xc0\xf6\xb1\xb4\x0b\x2f\xf6\xa5\x77\xf0\xcb\xa1\xf4\x1e\x7e\xfb\x22\xed\xc1\xfd\x63\xe9\x03\xbc\x38\x93\x46\xf0\xdb\x97\x43\xa9\x54\x82\x72\x59\x2a\x95\xa1\x8c\xa5\x31\x94\x65\xa9\x54\x81\x07\x57\x52\x07\x2a\xb2\x54\x7a\x07\x95\x63\xc9\x85\xca\x99\xd4\x85\x8d\xaf\x92\x06\x5b\x6d\x49\x81\xed\x0b\x69\x08\x4f\xcf\xa4\x26\xec\x74\xa5\xf2\x0e\x6c\x5d\x48\x0d\xd8\xee\x4a\x37\xf0\xec\x54\xba\x85\x67\xe7\xd2\x01\xbc\xb8\x92\x1e\x20\x6e\x49\xe5\x0f\x10\x1f\x4b\x6d\xa8\x1c\x4a\x3b\x25\xd8\x90\xa5\x16\x6c\x9c\x48\x47\xf0\xa0\x2c\x5d\xc2\x83\x1d\xe9\x1e\x1e\x1c\x4b\x3b\xef\x60\xab\x2e\x3d\xc2\xc3\x63\xe9\x19\x1e\x7e\x96\xae\xe1\xe1\xa5\x74\x01\xcf\x5b\x52\xa5\x04\x2f\xb0\x74\x0c\xbf\x7e\x95\x2a\x3b\x53\x98\x66\x50\xc2\xa6\x00\x60\x36\x37\x13\xfe\xcf\xff\x23\xc0\x93\x14\xe3\x13\xfe\xcf\xff\x2b\xc0\xd3\x04\x77\x64\x11\xdc\xde\xe3\x29\x96\x4e\x9a\x96\x79\x2f\xab\x36\x79\x57\x01\x62\x70\xc5\x1c\xc0\x73\xd4\x6b\xc3\x9d\x77\x7d\x78\x86\x7a\x25\x58\x86\x3b\x70\xb7\x0f\xbf\xa2\xde\x08\xee\xf5\xe1\x5f\xa8\x77\x00\x6f\xfb\xf0\x09\x9d\xf9\xbf\x5f\xf4\x15\xc0\xcf\xa8\xf7\x0c\xaf\xe1\x05\xbc\x84\xf7\x7d\x78\x87\x7a\x1d\x38\xee\xc3\xc3\x45\xbc\x3b\xad\x2c\x24\x1f\x25\xf8\x54\xca\xe5\xf8\x7e\xdf\x44\x91\x57\x09\x4a\xfd\x5a\xf4\x23\xf0\x15\x42\x8f\x59\x78\x7e\x86\xf0\x9e\x5d\xc6\x8f\x41\x07\x8f\xbf\x9e\x16\x34\xc2\x1c\xa0\xfa\x8d\xa8\x7e\x1a\xd4\x44\xcf\x45\x40\x19\xab\xba\x85\x06\x40\xf2\x33\x4a\x00\x6e\x95\x36\x11\xea\x05\x8a\x20\x57\x6e\xa0\x30\x32\x4d\x9b\x08\xfd\x20\xd0\x9f\xf2\x18\x5e\x75\xaf\x5c\xdc\x83\x7b\xe5\x52\x09\x96\xca\x3b\xa5\x77\xb0\x54\xae\x54\xf6\xc2\x8a\x21\xe7\xf3\xdc\x1d\x32\x80\x1e\x6f\x2a\xbd\x63\x43\xaa\x20\x84\xd4\xc9\xa4\x54\x62\x2f\x79\x50\x86\x42\x4d\x72\x79\x66\xb3\xb6\xff\x70\xb9\xd3\x93\xb7\x82\xd0\x01\x76\x11\xe1\x29\xe8\xd6\x06\x35\xd1\x6b\x69\xb1\x6a\x41\x73\x1b\x00\x49\xcc\x00\x1a\xfe\xc2\x7f\x50\xb6\xc3\x86\x54\xf3\xaa\xf8\x6b\xc0\xcc\xd6\xa1\xf4\x08\x24\x15\x21\x74\x5c\x0b\x20\x48\xe5\x0f\xd1\xfa\x6d\x20\x55\x76\x58\x06\xfe\x84\x4a\x3b\xa5\xe2\xfb\x72\x2e\x87\x3f\xa2\xd2\x87\x77\xef\x8a\xbb\x93\x09\xcd\xa5\x7f\xee\xb1\xdc\xf2\xbb\x72\xa9\x52\xf2\xdb\x3e\x02\x29\x84\xc2\xe8\xc3\xe7\xe7\x60\x0a\x60\xcf\x82\x0e\x34\xfa\x53\x98\x7e\x34\x92\xaf\xb9\x81\x2c\x2a\x82\x33\xe4\x55\x8d\x2d\x1a\x0e\xf0\x64\x00\x09\x23\x84\x0c\xe0\x4b\x1a\x19\x39\x55\xf9\x63\xf0\x08\x76\xd5\x27\x22\xab\x97\xcf\xcb\x0c\x24\x9d\x35\x01\xfe\xd5\x29\x96\xb3\x89\xd0\x08\x30\xe5\x7e\x4a\xe5\x01\xa2\x9f\x3e\x40\x1b\x39\x55\xfb\x53\xb1\xea\xbf\x17\x62\xf5\xb6\xb6\xec\xa5\xc6\x66\xf2\xb1\x99\x01\x28\x1d\x39\x55\x3d\x35\xb6\x01\x1b\x9b\xce\x40\x0e\x52\x63\x1b\xc4\xc7\x66\x46\x3e\xbd\x6a\xa5\x29\xbc\x9a\xf9\xaa\x1e\xae\x3a\x9f\x90\x3f\x78\x4f\xb3\xd1\x6f\x44\x8b\x81\xf1\x09\xa6\xea\x6c\x6d\xf9\xd4\x53\x9c\xc2\x2f\x99\x4f\x79\x7a\x74\xcd\x1e\x0b\xf1\xea\xd6\xbd\x27\x41\xad\xad\x52\x1a\x1f\x06\xc8\xe5\xd8\xcd\x34\xa3\x27\x27\x5a\xa8\x48\xde\x2a\x41\x1b\xc9\xf9\x12\x34\x11\xe9\xc9\x7d\xa8\x23\xf5\x13\x2a\xd6\x48\x4f\xed\x4b\x45\x38\x40\xa4\xc7\x71\x5c\x46\xcc\x29\x48\xe9\x70\x10\x02\x61\x17\x77\x36\x11\x3a\x8b\xe0\xda\x2f\xfd\x91\x51\x3a\x00\xe9\xb6\x5f\x67\x95\xee\x21\x84\xae\x44\x19\x92\x20\xfb\x84\x66\xb3\xfd\xed\xb1\x22\x3a\xa3\x5c\x8e\xad\xd6\xe3\x64\x42\x93\x16\x4f\x8e\xe2\xa0\xde\xd3\xd1\x4f\x26\xef\x53\xa3\xff\xc0\xe8\x22\x3e\x26\x84\x28\x0b\x1f\xc3\x4e\x3f\x32\xab\x5c\xee\x43\xf6\xd4\x7b\x2e\xec\x42\x0d\x36\xe0\x43\x7f\xd6\x44\xf8\x24\x10\x42\xcd\x58\xf6\xbe\x58\xde\x81\x4d\x18\x9d\xa0\x97\x4f\x61\xf6\xe1\x30\xab\xa8\x54\x86\x54\x38\x27\x0b\x4c\x14\xa1\x23\x86\xa6\xf2\x0e\x9f\x73\x39\xbd\x64\xa5\x77\x34\x6b\x32\x61\xa9\x19\x6b\xc5\xa7\x34\x86\x1d\x38\x8c\x4e\x67\x32\x29\x55\x52\x98\xda\xa1\xcd\x75\x8f\x7d\xdf\x65\x50\x40\x30\xb2\x87\x5c\x8e\x55\x8e\x0f\x83\xae\x93\xe2\x35\x3f\xf7\x65\xa4\x02\x35\x78\x03\x1f\x61\x0b\x1e\x81\x59\x20\xbd\x16\xe1\xf0\x72\x39\xda\xcb\xcd\x64\x92\x28\xa1\xcb\x46\x7b\xb9\x49\x8d\xe8\xc0\x97\x3a\xac\xa7\xf8\x54\x33\x0b\x7c\x50\xb7\xf3\x46\x62\xfa\xc2\xec\xaf\x34\xc0\xbf\xd2\xb5\xce\xe7\xee\x0b\xa6\x3e\xc4\x1a\x31\x8c\xf9\xb3\xec\x35\xa3\x04\x4a\x71\x40\x7a\x76\xbe\xd4\x67\xd3\xcd\xac\x13\x60\x63\x32\x61\xe8\xf2\x51\x70\x03\x1f\x60\x63\x26\xf1\x46\xea\x40\x4a\x96\xd1\x7a\x3e\x7b\x6b\x23\xb9\xda\x0e\xd9\xdb\x31\x22\xbd\x36\xe3\x1a\xc7\x29\xe4\xf3\xed\x15\xeb\xf0\x18\x70\x3e\x5a\x6d\x6f\x6d\x4d\xb3\x67\x1f\xe9\xeb\x09\x05\xdb\x2e\x3a\xb5\x9a\x2a\xc9\xd5\xa7\x70\x0c\x87\x88\xf4\x9e\xd8\x18\x0e\x97\x19\xc3\xa1\x3f\x86\x27\x3e\x86\x67\xce\xee\x78\x57\x54\x63\xa3\xfa\x5a\x06\x95\x5c\xc3\xcb\x7e\x7a\x61\x7b\xd7\xf0\x22\xab\xf6\x45\x14\x88\xbf\x1c\x17\x69\x74\x7f\xce\x00\xa9\xc4\xf1\xe1\x81\xfc\x9c\xda\x05\x07\x4b\x11\xe8\x4c\xd2\xa3\x20\x1a\x4b\xd1\x67\xb0\x65\x6f\x40\x6a\x4e\xcd\x60\x2b\xa6\xeb\xf8\x03\xed\xc6\x40\x56\x4a\x1c\xe3\x2c\x1d\x84\x92\xf3\x0b\xd5\xce\xfa\xf0\x0f\x54\xaa\x7e\xf9\x54\xf4\xca\x49\x6f\x6b\xeb\x4b\xbf\x0a\xfe\xc8\xe7\x69\xdb\x3f\xfe\x55\xde\x44\xc5\x00\x9c\x2f\x41\x69\x27\x2d\x3e\x9e\xa3\x5a\x5d\x3a\x99\xc2\x3f\xa8\x81\x94\xf2\x9b\xa4\x6c\xf3\x62\x44\xf8\xf3\xd1\x91\x4f\xc8\x3f\xac\x0a\xc5\x1b\x17\xec\x87\x22\x06\xd0\x42\x32\x0f\x46\x35\x78\x30\xaa\x1a\x0b\x46\xfd\xc2\x6e\x24\x1b\xec\x7a\x5c\xbc\x33\x32\x99\x88\x04\x45\x5e\xd7\x0d\xf4\xe5\xf0\x51\x5d\x3f\x6b\x0a\xc2\x1e\x61\x64\x1a\x7e\xef\x3b\x89\xde\x59\x44\x6c\xd9\x1f\x44\xc4\x65\xca\x7e\x0d\x25\x80\x9f\xcb\x45\xdf\xe0\x8d\x97\x4d\x26\xa2\x8a\xd4\x19\xd7\xe7\x7d\xc6\xd0\x86\xc7\x51\x2d\xbd\xf6\x28\xe1\x29\x00\xb0\x67\x40\x15\x86\x5e\x58\x14\x03\x5c\x4b\x06\x08\x47\x2e\x59\x90\x5c\x0e\xf7\x9c\x3e\x55\x6a\x3f\xbc\xdb\xe3\x1f\x1f\x51\xa5\xf8\x61\xf7\xc3\x94\x3f\xee\xd2\x9f\x02\xf8\x27\x5d\xca\x99\xde\xb1\x2c\xe7\x08\x7b\x0d\x23\xf9\x5b\x2f\xd0\x42\x75\x68\xa0\x3f\x44\x87\x5f\x15\x90\x45\x83\x22\xd2\x46\x2a\x45\xa4\x89\x54\x8a\xc8\x01\x52\x43\x44\x6e\x38\x59\x36\x12\x01\x2f\x56\x9e\x77\x91\xfa\x89\x98\x3c\x25\x1f\xdf\x65\xb2\x55\xaa\xfd\x90\xbe\x88\x0e\x34\xa1\x0d\x49\xbe\x04\x07\x80\x6a\xe2\xd6\x14\xfe\xe7\x5c\x15\xf9\x11\xda\xa2\xfe\x95\x10\xcb\x7b\xd1\x1c\x39\x08\xa1\x1f\xb1\xdf\xa8\x5e\x70\x1b\x64\xa4\x0f\xe6\xdc\x8d\x48\xa0\xcb\xfb\x3d\x61\x6e\xc8\x26\x4f\xd0\x52\x2e\xb3\xc8\x3b\x7d\x45\xe8\xf8\x3f\x7a\x1c\xfc\x88\x0c\x09\x0f\x98\x49\x3e\x0f\x9c\x1e\xe9\x23\xdc\x23\xe1\x42\x06\x4f\xed\x31\xc0\x74\x20\x22\xf6\x70\x11\xc5\x81\xf7\xa4\x74\xf2\xc2\x0a\x31\x86\xec\xf7\x87\xbd\x0b\x1a\xa0\x1a\xf7\xdd\xae\x42\x82\x1e\xf9\x19\x48\x16\x2d\xfe\xf6\x8a\xc1\x43\xda\x0d\x4a\x7e\x26\x32\x7a\x65\x4a\x85\x3e\x0d\xc1\x11\x2a\xc2\x31\x2a\xfa\xc7\x04\x06\x79\x72\x12\xbf\x28\x3d\xfe\x14\x28\x5b\x2f\x43\xd3\x60\xde\xe5\x6a\xf8\x93\xd1\xf5\xea\xf8\xe3\x20\x97\x13\x31\xa2\xa4\x68\x43\x15\xe6\xf3\x63\x68\x02\xaa\xa4\xd6\xab\xcc\x9a\xc6\x9b\x08\xd5\x27\x93\x31\x67\xc7\xe1\x49\xe5\x9f\xa2\x03\x31\x1c\xc1\x71\xf8\xe0\x02\x1a\xfb\x3e\x6c\x02\x79\x67\x25\xdf\x83\x17\x74\x3e\xfd\x19\x51\x1e\x9e\x27\x3b\xcb\x51\x83\x48\xa1\x7b\x79\xde\x6a\x94\x7f\xb4\xda\xf5\xc6\xd7\x1f\xe5\x1f\x27\xf8\xe2\x28\x9d\xcb\x42\x40\x7f\x1c\x37\xda\xfb\x97\x07\x61\xe9\xe9\x49\xeb\xf2\xb2\x51\xff\x21\x9f\x9c\x79\x35\x4b\xa9\x3a\x7e\xfe\x69\xb3\x79\xd1\xb8\x0c\xf3\xbb\x97\xcd\xbd\x1f\x65\x39\xe8\x21\xd9\x2e\x59\x9e\x6c\x1f\x8c\xec\xe4\x2c\xd5\xf6\xf8\x42\x39\x9b\x09\xb8\x8e\x2f\x71\x62\x96\x2c\x2b\x7b\x8a\x31\x50\xc9\x31\x5c\x1c\xb4\x9a\x97\x3f\x4a\x3f\xca\xc9\x61\xb1\x82\x54\xbd\x64\x46\xf9\xd7\xab\xe8\x11\x67\xb1\x9c\x46\xcf\x2e\xfb\xad\x87\x04\x12\x4b\xd4\x14\xcf\xc4\x77\x99\x5a\xe7\xe9\xb5\x51\xb7\x64\xa8\xcf\x5f\x51\x76\x6d\xe3\xd3\x27\x99\x5a\xf2\xb3\x89\xa2\xf4\xf1\xa3\x0c\x47\x59\x94\x34\xd8\x2a\xc1\xf1\x7c\xfa\x2b\x15\xcb\x15\xda\x43\x67\x2e\x09\xeb\xf9\x31\x74\x17\x6e\x82\x0e\xec\x2e\xdc\x48\x3b\x65\xf6\xf2\x4a\xf6\x2e\x74\xf3\x5d\xa8\x2c\xb5\x8f\x3d\xcc\xa8\x70\xb8\x80\x29\x94\x3e\x7e\x34\x61\x73\x06\x3f\x19\x6e\x95\x60\x83\xb9\xdd\xb3\x78\x50\xda\x6d\xcb\x9e\xce\x1a\x12\x2a\x5c\x00\xff\x7d\xfe\xb8\x54\x23\xa0\xc6\x7f\xec\xcb\x1c\x3d\x77\x75\xc3\xd9\x29\xb3\x7c\x20\x12\x7e\x0d\x31\x92\x27\xb2\x4b\x50\xf3\x9b\x97\xde\xa5\x9b\x7b\x79\x22\xbb\x3a\x69\x79\xc2\xad\x54\x66\xb1\x18\xdb\xec\xd7\x94\xcb\xcc\xbd\xb4\xdb\xaf\xf9\xa5\x62\xb9\x92\xa7\xc5\x60\xbb\x0c\x24\xc7\xcb\x0c\x5f\x66\x0a\x8b\x2b\x91\xdf\x5d\x20\xee\x46\x43\xcc\x0a\xfa\x90\xa1\xca\x7e\x21\x94\x71\xef\xb9\x5a\x0f\xab\xfa\x77\x6a\x3e\xde\xaf\x23\xb1\x60\x4e\x5f\xf5\x61\x4f\x26\xf3\x1c\x4f\xf2\xdf\xea\xda\xed\x45\x54\xf9\xa1\x19\xac\x06\x37\x28\x0c\x1f\x18\xfd\xf0\xae\x8c\xb2\x1f\x23\x50\x33\x7e\x7a\x40\x23\xe9\x6b\xf6\x01\xb9\x78\x6c\x94\x8a\xe3\x4f\xa8\xc8\xb5\xa0\x8f\xbb\xbb\xe5\x0f\xef\x26\x13\xfc\x69\xf7\xdd\x4e\xe9\x03\x73\xfa\x52\x62\xde\xf5\x2d\x13\x82\x44\xd1\xfb\xad\x02\x36\x84\x1e\xfe\xf4\x49\xee\x83\x8f\x1f\x6d\x90\x17\x71\x6e\x04\xc2\x11\x51\x6d\x88\xc1\x5c\x00\x41\xcf\x8b\x78\x8b\xf5\xfb\xe9\x93\x0c\x16\xc0\x8a\xe3\x28\x84\xa9\x6d\x29\x79\x11\x7f\xfa\xa4\x02\x18\x03\x4e\xfa\x90\xe4\x11\x1d\x64\xae\x09\x53\x5d\x93\x45\x23\x2f\x95\x4a\x95\x52\xa9\xe4\xf7\x13\xd6\xc8\x58\x9a\x20\x42\x28\xb1\xb2\xa1\x16\xb7\x40\x49\x09\x1f\xb6\x15\x8e\x5c\x1c\xfc\xa7\xe0\x0a\x6e\xd5\x4d\x8c\xcf\xf0\x0d\xfb\xe4\xff\xb5\xb0\x8c\xf1\x3e\xfd\xa7\xa1\xe1\x2e\x96\xaf\x70\xb3\x82\xbf\x69\x32\xc1\xfb\x57\xf8\x0a\xcb\x26\x3e\xc0\x98\x60\xfe\x7d\x83\x95\x06\x6e\x61\xac\x63\xa5\x83\x0f\x35\x6c\x62\xc5\xc4\x47\x45\xec\x74\x94\x0f\xf8\xa4\x8b\xbf\x6a\xf2\x7d\xb4\xfd\x5f\x9d\xfa\x67\xfe\x5d\x3f\xc7\xed\x3b\xbc\xa3\xd5\xef\xf1\xa9\x8b\x3f\xe0\xfa\x1e\xc6\x1d\xb9\x8e\x1b\x5d\x7c\x6e\xca\x2d\x6d\x1f\xe3\x96\x86\x0f\xdd\xc6\x23\xbe\x1c\xc8\x67\x6e\xb3\x89\xbb\x45\xf9\x12\x37\xbb\xf8\xb3\x2b\x7f\xc3\x4d\x1b\x7f\x3d\x91\x89\xbb\x4f\xf9\x3e\xd6\xdd\xfd\x4b\xfc\xcd\x96\x4d\x6d\xff\x0e\xab\xae\xec\xe0\xfd\x3d\x3c\x68\xc9\xcf\xda\xc1\x05\x1e\x9a\x72\x05\x1f\x98\xf8\x06\xcb\x79\x7c\x90\xc7\x9d\x2b\xa5\xae\xb5\xbe\xe0\xc7\x8a\x7c\xa0\xb5\xee\xb1\x5e\x51\xda\x5a\x2b\x8f\xef\xba\xca\x65\xe7\xf0\x12\x8f\x6c\xe5\xca\x3d\xb4\xb0\xd1\x50\x48\xe7\x48\xc6\x77\x45\x45\xef\x1c\x9d\xe3\x87\x3b\xc5\xec\x1c\x99\xd8\xc2\xca\x18\x1f\x63\x6c\x77\x94\xbf\x70\xcb\xc5\xed\x8e\xb2\x83\x8f\xef\xf0\x1f\x18\xbf\xc7\xc7\x45\xfc\xe8\x2a\xb8\x73\x72\x88\x9f\x70\x7d\x1f\x9f\xb8\x58\xc1\xf5\x43\xed\x64\x8c\xff\xba\xaa\x9f\x69\xa7\x18\x37\xae\xea\x17\x5a\xfb\x02\x97\x5a\xf5\xae\xd6\x56\x71\xc9\xac\x5f\xe1\xb6\x8e\xcb\xad\xba\x46\x97\x61\xdf\xac\x6b\x58\x7e\xc6\x3b\x57\xf5\x1b\x5a\xbf\xd5\xa1\xf9\x47\x78\xb7\x55\xbf\x67\xdf\x18\x9b\xda\xe9\x9f\xb8\x82\x31\xab\xdf\x5a\x32\x3d\xda\xab\x3b\x2e\x6f\xff\xe8\x9e\x1d\xe0\xbd\xbd\x7a\xc9\x3d\xbb\xc1\xcf\xb8\xbe\xeb\x9e\xd9\x78\xbb\x53\xdf\xc6\xbc\x5c\xc6\x9d\x13\x59\x6e\x35\x34\x8c\xbf\xc8\x72\xa5\x71\xa8\x75\xc6\x72\xfd\xa4\xd1\xc2\x27\xef\xe5\x46\xa3\xf1\x55\x93\x0f\x65\x05\xd7\xbb\x9d\xf3\x6f\xf2\x7e\xa3\xa1\x76\x3a\x2e\xae\x63\x3c\xe8\x74\xf2\xf8\xeb\x5d\x43\xeb\x5c\x1c\xca\x87\x8d\x86\x86\x95\x2b\x99\x8e\x17\x5f\x98\xf2\xd1\x5e\xc3\x71\x3b\x2e\x3e\xde\x6b\x3c\x75\x2e\x92\xe3\xd3\xf0\x49\x91\xc2\x25\x94\x3e\x62\x69\xbb\xdb\xf8\xaa\xd5\xbf\xc9\xa7\xb4\xdf\xfa\x83\x7c\xd6\x68\xe4\x3b\x1d\x59\xee\xdc\x35\x1b\x9d\xee\x37\xf9\xa2\xd1\x3c\xea\x74\x9f\xe4\xcb\x6e\xf3\xac\xf3\xb9\x29\x77\xdd\xe6\x67\xfc\x79\x20\x7f\xae\xe0\x2b\xf7\x33\xc1\xfb\x76\x73\xe0\x7e\x7e\x2f\x5f\x9d\x34\x75\xf7\xcb\x05\xcd\xbf\xd7\xbe\x68\xb2\x3a\x68\xc6\xfa\x39\xb2\x9b\x5f\x35\xe5\x59\xbe\x6e\x34\xc7\xda\x97\xf7\xf2\xa0\xd5\x74\xb5\xaf\x2d\x2f\xed\xc8\xc3\x4e\x73\x07\x7f\xbd\x93\x89\xdd\xdc\x73\xbf\xbe\x97\x3b\x27\xfb\x8a\x7b\x75\x29\xdf\xda\xfb\x2d\xf7\xca\x92\xff\x38\xd9\x3f\x75\xbf\x11\x5c\xdf\xdb\x3f\x77\xbf\xb5\xe5\x51\x05\x7f\xc6\xdf\xae\x69\x9a\x39\x2f\x3f\xdd\x3f\xd9\xff\xaa\xc9\x7f\xca\x46\x63\x7f\x4e\xbd\x5d\xd9\xc4\xfb\x15\xf7\x62\x5f\x36\x2b\xfb\x77\xae\x4a\xf1\x56\x3f\xd0\xce\x77\x83\x7a\x87\xf6\xbe\x86\xe5\x7d\x4a\x17\xa6\xab\x5a\xb2\x75\xb2\x6f\xbb\xaa\x86\x8f\xed\x7d\xd7\xbd\x3e\x96\xff\xc0\xb8\xe8\x5e\xab\xb2\x63\xee\xef\x74\x78\x5a\xd6\x82\x74\x24\x8f\xed\xfd\x3d\xf7\xfa\xbd\xac\x9d\x1c\x28\xee\xe0\x52\x7e\xb2\x69\xfa\x87\xfc\x6c\x1f\x9c\xe0\x41\x49\xfe\xab\x7b\x70\xaa\x0d\x15\xf9\x83\xb9\x7f\xa1\x0d\x2f\xe4\x92\x79\x70\x85\x6f\x54\x79\x64\x1e\xa8\x2c\x6d\x1d\x44\xe0\x85\xe9\x1f\xdd\x83\x76\x87\xb7\xff\x95\xfe\x4a\xb3\xd2\xeb\xce\x90\xd1\xf9\x3f\x3d\x8e\x5f\xe9\xaf\xf4\x57\xfa\x2b\xfd\x95\xfe\x4a\xd7\x93\x0e\x4b\xf2\x4e\xf1\xe7\xf6\x53\x39\x39\x28\x6b\xea\x91\xfc\x6e\xaf\x91\xad\xff\xef\x1d\x8c\xdc\x21\xc1\x87\x7b\x07\x0f\x2e\x61\xf9\x96\x4b\x76\xe4\x12\xd5\x1b\x95\x6d\x79\xaf\x7b\xf0\xac\x0d\x5c\xdc\xc6\x07\x65\x7c\xa3\xc9\x15\x8c\xdf\xe1\x1b\x57\xfe\xab\x22\xe7\xf1\x00\x2b\x4d\x57\x56\xb0\x76\xa6\xc8\x83\x96\xa9\x35\xae\xf0\xf9\x5e\xeb\xd0\xd5\x31\x56\xf6\x5a\x6d\x57\xdb\x56\x14\x5c\x3f\x77\x6f\xcf\x94\xe6\xa0\xf5\xd5\xbd\x35\x94\x86\x59\xdf\xd7\x7c\xfd\x5e\x7e\x54\x0e\x06\x2d\x82\x6f\x77\x95\x03\xb3\x45\xdc\xdb\x3d\xe5\xa0\xd8\x1a\xba\xb7\x15\xe5\xe0\xae\x45\xb4\xdb\xf7\xca\x81\xdb\xba\xe9\xdc\xee\x28\x07\x5a\x8b\x74\x6e\xdf\x29\x07\x76\xeb\x06\xdf\x7e\xf8\xd5\xee\x57\xbb\x5f\xed\xfe\x9e\x76\xb7\x58\x3f\x56\x5a\x95\xd6\x09\xc6\xcc\x8e\x5f\x6b\x7a\x78\xd5\x1a\x69\xfa\x17\x65\xad\xa9\xb6\xfe\x71\xfe\x4a\xff\xeb\xd3\xb9\x72\x72\xb7\xd2\x62\xe9\xbb\x56\xab\xac\xa9\x7f\x2a\xc7\xad\xd6\x58\xd3\xb9\x3f\x4c\xfb\x63\x5f\x99\xe3\x3f\x7b\x76\xf5\x03\x7c\x85\x71\x91\xca\xbd\xf6\x5d\x6b\xa7\xf3\xc7\x48\x39\x2d\xb6\x3e\xe0\x3f\xf6\x82\x76\xb8\x75\xa8\x68\x77\x17\xca\xb9\x79\xd8\xd2\xee\x0c\xe5\xf2\xea\xe0\xd8\xbd\xdb\x51\xbe\xfd\x0c\xfa\xe7\xe3\xc6\xb8\x89\x3d\x27\x12\xc6\x03\x2c\x13\x7c\xe0\xe2\x0e\x56\x3a\xf8\x08\x63\xab\xa3\x7c\xc0\x87\x9e\x73\xa8\x51\xc4\x3b\x9a\x7c\x8e\xdb\x15\xfc\x1e\xd7\xf7\xf0\x89\x2b\xef\x6b\x0d\x8c\x8f\x06\x72\xdb\x6d\x34\x71\xd7\x95\xbf\xe2\x66\xa5\x73\x77\xab\xdc\x37\x8e\x0c\x6c\x0d\x14\x0d\x1f\x1c\x60\x1b\xcb\x7f\x55\x8e\x19\x70\x17\x1f\x60\x3c\xcc\x2b\xef\xb0\x6c\xe2\xfd\xbc\xb2\x1d\xcd\x1f\xe4\xeb\xcd\xca\x09\xfb\xde\xad\x9c\xec\x68\x2e\xa9\x7f\xae\xb4\x0d\x6d\x87\xd4\x55\x56\x5f\xc3\x2b\xa5\x0d\x52\xff\x13\xcb\x9f\xb5\x77\x5f\x68\x6a\x76\xde\x79\xf9\x07\x5f\xeb\x8f\x83\xd3\xb6\xbb\xbd\x43\xd3\x0f\xee\xfb\xf5\xa5\xc6\xe0\x2c\x32\x9f\x5f\xe9\xaf\xf4\x57\xba\x8e\xf4\xfd\xe0\xec\xcc\x1d\xed\x2b\xdd\xca\xe1\x49\xc0\x57\xe5\x2f\xca\xe7\xca\xe1\x55\xe7\x1e\xe3\xfd\xbb\xc3\x01\x1e\x55\x94\xaf\xee\xa1\x86\xef\x42\x7e\xde\xd2\x0e\x35\xac\x1c\x2b\xdf\x4e\x68\xfa\x4d\xf9\xb6\x77\x68\xba\xf7\x96\x72\x85\xb1\xed\xde\xb9\x9e\xdf\x7b\x8f\xc2\x1b\xbb\x77\x58\x3e\x39\x39\x7c\xa6\xf0\x4e\x2a\x87\x1a\xae\x7f\x56\x2e\x43\xb9\x30\x8b\xaf\xff\xe9\x5e\x7d\x91\xdb\x77\x11\xbd\xa7\x3e\x54\x08\x3e\x7c\x87\x8d\xb1\x72\x5e\x69\x7c\xd0\xee\x5c\x7c\x56\x39\x94\x3b\x66\x5b\xf9\x83\x96\x2b\x18\xcb\xdd\x23\x26\x07\xe4\xe2\xd1\x21\x36\x6d\xe5\x8f\xce\x91\xc6\xda\xbb\x47\x1d\xf7\x4f\x8c\x1b\xf6\xd1\x63\xe7\x7e\xa8\x7c\x3e\x39\xfa\xe2\x9a\x61\xff\xc7\x83\x06\x6b\xbf\x7f\x72\xa4\x61\xd9\xe2\xf0\x66\xca\x33\x22\x2f\x92\x77\xad\xbb\xc6\x59\xa7\xf9\x97\x62\x98\x47\x7a\xe7\x42\x51\x4c\xf3\xe8\x0e\xff\x79\x28\x1f\x6a\x47\x26\xfe\xf3\x4e\x31\xef\x1a\xfb\x78\xdf\x56\xac\xce\xd1\x23\xb6\x64\xde\x5f\xfd\x50\x71\x1a\x47\xcd\xce\xc1\x37\x65\xdc\x38\xda\xd6\x0e\x1e\x94\xc7\xc6\x51\x08\x97\xe2\xc5\x6d\xe4\x3b\xa6\x4b\xf1\x73\xe6\x36\x64\xe5\xaf\x68\xbf\x54\xce\xdd\x1d\x37\x3a\xb6\x5f\xfe\x4d\x79\x6e\x1c\x6b\x18\x9f\x2a\xca\xdd\xf1\x09\xc6\x4f\xca\x5f\x2c\x8d\x8d\x97\x8b\xa0\x46\x2a\x9f\xa5\x8d\xbb\xe3\xcb\x8e\xf3\x59\xa9\x60\xfc\x15\x3b\x77\x34\xd5\x3b\x77\x99\xf3\xbe\xc6\xce\x93\xb2\x73\x77\xac\xe1\x71\x53\xa9\xd8\x1c\xde\xe1\xc9\xf1\xc8\x1d\xdf\xc4\xc7\xb9\x42\xba\xec\xf9\xd9\x12\xe9\x83\x6b\x47\xf0\xc8\xf2\x1f\x95\xe4\x39\xdd\xf1\x20\x1b\x0f\x4b\xa4\xab\x8e\xe7\xd1\x1d\x63\x7c\x32\x38\x4e\xe9\x33\xda\x38\xf6\x5d\xec\xd8\x3f\x45\x1f\x5b\x6a\x9c\xed\xbb\x60\x7c\x15\xbc\xc4\x38\x56\x5b\x97\x43\xba\x8f\xdf\x79\x70\x6f\xdd\x03\x97\xae\x47\x1e\xdb\xb8\x8e\xb5\x93\x06\x76\xd7\x34\x5f\xde\xdf\x3e\x76\x87\x75\xa5\x7b\xc2\xf2\x95\xe2\xc9\x3f\xef\x7f\x5a\x36\x75\xdf\xd4\xfe\xac\xb3\x2e\x3c\x2e\x93\x66\x8e\xa3\x2c\xf3\xfd\xbf\x5b\xcf\x2e\xf7\xfd\x71\xcd\xfa\xdf\x68\x8f\xf8\x74\x78\xd9\x79\xba\xa8\x37\xcd\x93\xb5\xc0\xcd\x38\x1f\xbe\xd2\x9e\x08\xde\x37\x4f\xbe\x6a\xf2\x53\xfd\xe0\xee\xe4\xc6\x7d\x22\xb8\xd5\x3d\x61\xe5\xad\xe2\x49\xba\xbd\xf2\xb9\x7e\x18\xcd\xe7\x70\x1e\x3a\x4f\x04\x1f\xd9\x27\xb6\xfb\xfc\xbe\xde\xac\x60\x57\x7b\xfe\x50\x3f\x31\x4f\x66\x9f\x4b\xd7\xcf\xeb\xed\xbb\x13\xd2\x91\xff\x54\x08\x3e\xd9\xc1\x4f\x7b\xf8\xf4\xea\xe4\x3d\xfe\xab\x58\x3f\xd3\xe6\xb4\x4b\xa6\x8a\x86\x31\x6e\x9b\x18\x1f\xd4\x3b\x95\x76\x53\x2b\xfe\xdd\xf6\x23\xa9\x5f\x5c\xb5\xff\x69\xfb\xf5\x55\xf2\x4a\xa9\xb4\xfd\xf5\x6b\xff\x2d\x78\xab\xb4\xcf\xb5\xd2\x69\xfd\xf3\x55\xfb\xab\x56\xba\xaf\x5f\x62\x7c\xdd\xc9\xee\x37\x33\x1e\xc0\xe8\xb6\x89\xb6\xa3\xc8\x57\xb8\xed\x6a\x5f\x9a\xf5\xa1\xb9\xff\x07\xde\x49\xd7\x8b\xa5\x6a\xb7\xfe\xcd\x6d\x3f\xe0\xb2\x49\xeb\x97\x35\xd5\xad\x5f\x0f\xda\x8f\xee\xce\x01\xff\xbe\x3e\xab\x0f\xaf\xda\x3b\x78\xe7\xa6\x4e\xae\xda\x65\xed\xda\xae\xdf\x9c\xb4\x59\xfb\x47\xb3\xbd\xad\xed\xa8\xb2\x76\x75\x5a\xd7\xde\xab\x41\x3c\x86\x7c\x75\xca\x52\xa5\xbb\x5f\xd6\xae\x48\x7d\x54\xc1\x87\x78\x97\x60\xc5\x3d\x2d\xbb\x7c\x3c\x27\x9d\xca\x6e\x3d\x32\x8e\x4e\xe7\xfd\x82\x71\xfe\xec\xf4\xdb\x61\xfd\x3f\x2d\x9e\xa2\xd4\x38\x2d\x6b\x57\xff\xfc\x38\xb2\xf9\xfd\xb7\x14\xbe\xca\x8d\xd3\x7f\x7e\x5c\xcb\xa5\x2a\xae\xac\x1f\xee\x0e\x3e\xfd\xe7\xe8\x77\xd5\x74\x05\xba\x2a\x37\xfe\xc1\x79\x7d\x3b\xac\xff\x47\xe0\x6b\x89\xf4\xee\xee\x94\xe0\x77\x1a\x3e\xc2\xd8\x8c\xf2\x6b\xf6\xad\x68\xd1\x54\xc3\x95\x7f\x58\xde\xd5\xb7\xb7\xdd\x0e\x8b\x46\xc5\x38\x99\x16\x69\x2d\xfe\xa7\x96\x55\x3e\x37\x3d\xc2\xf2\x09\x6e\xba\x98\x60\xd9\xc6\xfb\x1a\x4d\x07\xb8\xa9\xe1\x0b\x2c\x57\xf0\xbe\x8b\xaf\x30\xde\xe3\x5e\xd5\x86\x8d\x2f\x5c\xf9\x38\x2b\xdd\xc7\xf8\x8a\xd6\x3f\x60\xed\x4f\xf0\x81\x26\x77\x70\x13\xe3\x2e\x7e\x5b\xda\xd4\xf0\x35\x96\x5b\x1e\xdc\xca\x9b\xe1\xb1\x54\xbe\xc2\xf5\x0e\x3e\xa7\xf0\x64\xfc\x5f\xf4\x9f\x62\xe3\x23\x17\x5b\xff\x0d\x69\x9c\xce\xba\xab\xd0\xe3\x9c\xf4\x8e\xd2\x83\xca\xe8\xd4\xa5\x74\x51\xc1\x07\x1d\x3c\xa4\xe9\xa5\x8b\xbf\xd2\xb4\xde\xe1\x74\xb2\x4f\xe9\xa6\xb1\x47\xf3\x4f\xe9\xba\xf3\x7a\x45\x7c\xe9\xca\x67\x94\xbe\x59\xda\xd8\xc3\xcd\x37\xd2\xe9\x81\xd7\x9f\x4f\x9f\xeb\x49\x8b\x6b\x86\xf7\x77\xa4\x74\x5f\x55\x32\xf6\xe9\x3f\x3d\xae\x25\xc6\xbd\x06\x3e\xf5\xf7\xa5\x91\xf1\x37\x31\xa5\x63\xcc\xe9\x9c\xd2\x33\xfb\xee\x78\xf9\x9d\x4c\xba\xf2\xf6\xc1\x81\xc6\xf7\x4d\x3d\x31\xff\x59\xeb\xba\xea\x3a\xae\x67\xbf\xff\xad\xe9\xe1\x32\xfc\x47\xe9\xd0\x7a\x61\xba\x04\xdc\xd8\x7a\xf9\xf8\x61\x7c\x32\x82\xf7\x7d\x9a\x46\xf8\x67\x58\x3f\x58\x77\x56\xff\xc8\x7d\x1d\x9d\xbf\xb6\xdd\x2b\xd6\xf9\x3f\x64\x5f\x07\xa9\xb5\xa6\x7d\xc7\xd6\x25\x63\x1f\xac\x09\x7e\x3c\x3d\x62\x7a\x57\x91\xd3\x03\xef\xe7\x3a\x2d\x57\xff\xbe\xb4\xde\xc1\x8d\x60\xbd\x83\xf4\x84\xa6\x99\xf2\xff\xb3\x26\x7f\xc1\xcd\xab\x37\xa7\x31\xb8\x7e\xbe\x8f\xf7\x39\xfa\xc7\x2c\x7a\x08\x4e\xd7\x43\x7d\x75\xee\xbc\x1b\x2e\x6e\x50\x78\x0d\x17\x5f\xfe\x64\xbe\xfe\xca\xf5\xc9\xd6\xc7\x59\x4a\xe7\xd9\xc1\xdf\x02\x79\x8c\x3b\x6f\xd4\x9b\x4f\xb2\xc7\x99\x89\x47\xde\x2e\x46\x2f\x91\xfc\x59\x76\xc4\x85\x1b\x97\x73\xcb\xca\x1d\xc6\xdf\x58\x7f\xff\x01\xeb\xc2\xe8\xf0\x9f\xd6\x13\xe2\xe9\xdc\xf1\x72\x7e\xb3\x58\xaf\x9f\x63\xff\xfd\xdd\xe3\xe6\xf4\xc8\xd6\xff\xca\xa3\xcb\xd8\x78\xd7\xb2\xde\xc9\xfe\x23\xdf\x49\xba\x88\xf0\xe9\xc5\xf4\xfa\xa6\xf1\xa5\xc6\xe9\xf3\xbb\x05\x72\xe8\xb5\xf6\xdc\x1b\xe4\xe5\x5a\xc7\x81\xad\x25\xf7\x1f\x59\xaf\xfc\xfb\x59\xfc\x84\xf3\xe3\x95\xc6\x93\xb9\x1f\xe6\xf4\xc7\xeb\xb5\xa9\x1e\x31\x9b\xdf\x72\xbe\xb9\xea\x7e\x9c\x45\x17\xa1\x5e\xbb\xc2\x3e\xcc\xac\x17\xe8\xbb\x09\x38\xbe\x7f\x21\x1b\x7f\x11\x3a\x89\xf9\x21\x66\xd1\x5d\x4c\x7f\x49\xd2\x6d\x04\xce\x22\x79\xc5\xf4\x8a\xf8\xbc\x4e\x98\xbe\xe1\xd9\x61\x49\xbf\x48\x1a\x7f\x19\xe3\x58\x03\xfe\x32\x53\x7f\xde\x71\xfc\x25\xf7\x59\x62\xbc\x19\xf8\x8a\x8d\xd7\x5f\xff\xb8\x1d\xe3\xa7\x73\xe8\xaf\x11\xd5\x4b\x66\xe9\x93\x8b\xf1\x97\xc1\x77\xd6\x8a\xbf\xe5\xe8\x2f\x86\xd7\x24\xfe\x96\x95\xb3\xfe\x78\x96\xa2\x3f\xee\xb7\xcd\xe4\xdb\x19\x7a\xc9\xfa\xf7\xef\x72\xfb\x6f\x0e\x3f\x7f\xe3\xfe\xcb\xe6\x5f\x73\xf0\xdb\x08\xe8\x34\x73\xff\x65\xcb\xaf\xd8\xba\x70\x3b\xd0\xca\x6a\x97\xe4\x57\xcb\xea\x23\xb1\xf1\x25\xf1\x19\xc7\x63\x5a\xcf\xcc\xc0\xeb\x1c\x79\x3e\xdb\x5e\xf0\xc7\x93\xd2\x5b\xec\x94\xbd\x15\xa3\xf7\x75\xed\xc3\xcc\x75\x99\xbf\x6f\x7d\xba\x59\x76\x1f\x66\xf2\x97\xe4\x3c\x32\xf4\x9f\x08\xbe\x67\xe3\x6f\x59\xfd\x89\xdb\x35\x7f\x3f\xfe\x92\x70\x22\xfb\x61\x2d\xf8\xcb\x90\x0b\xab\xe2\x2f\x8d\xff\x39\xfc\x71\x0d\xfa\xd8\x6c\xbd\x6a\xd6\xfc\xe3\xf2\x3c\xc2\x2f\x1a\x0b\xfb\x59\x76\xff\xa5\xe8\xc5\xcc\xe6\x17\x73\xe9\x67\xb9\x7d\xf3\x0a\xfd\x75\x76\x3b\x9f\x2f\xce\x92\xa7\x3e\xbd\xcd\x3c\x27\xea\x04\xe5\xb3\xed\xea\xe5\xec\xd1\x08\x7e\xc8\x42\x7a\x6a\xb2\xc3\xa3\xc1\x7a\x53\xfc\x67\x90\x2a\x26\x3e\xd2\xa2\x69\xd8\xff\xbe\x9b\xd1\x3e\x55\x9f\xa5\x64\xde\x7c\xeb\x1d\xdc\x4e\xf0\x1d\x06\x8f\xa5\xb3\xbe\xe7\xe0\xe1\x28\x73\x5c\x76\xbc\x9c\x7d\xf3\xf6\xc9\xf2\x39\xf3\xb7\x78\x1a\x1f\x57\x12\x6e\x6a\xfe\xcb\xac\x77\x04\x4e\x17\xe3\x53\x8c\x2b\xb8\xae\xe1\x53\x7e\xce\x41\xbf\xef\xbc\xb4\x88\x95\x0e\xbe\xa4\x2a\x3a\xf3\xeb\xc9\x27\xf4\xdb\x3b\xb7\x8e\xf8\xb5\x93\x72\xf0\x55\xfe\x0f\x6a\x7f\x75\xb8\x7f\x8c\xc3\xfd\x82\xe5\x06\x6e\x6a\xf8\x7c\x9e\xfd\xf6\x76\xff\xd1\xca\x76\x73\x3b\xfb\x3b\xdb\xfe\x9b\xb5\x3f\x7f\x8a\xff\x59\xf1\xe8\x3b\xb9\x1e\x1c\xaf\x99\xe7\x1c\xfe\x3a\xd7\x13\xe5\xec\xdc\x26\x63\x9f\xac\x7f\xff\x7b\xf4\x9c\xde\xc7\x8b\xd3\xa6\x3b\x4f\xdf\x65\xf6\x7c\xe4\x7c\x2e\xcd\x77\x22\x70\x92\xe3\x08\xcb\x67\x8d\x6f\x3e\x9c\xd7\xce\x93\xc1\x9b\xb7\x7f\x13\xf5\x33\xf7\x43\x52\xaf\x5a\xab\x9f\x35\x6e\x47\x7c\x61\xef\xbd\x69\x6b\x4e\xef\xf0\x97\x8e\xfc\x6d\xcd\xa9\x8a\x9b\x26\xfe\xa2\xad\x37\x5d\x4a\xbf\x9c\x85\xff\x98\x7d\x94\xb4\x2b\x17\xe9\xa5\xaf\xd0\xef\x96\x6a\x1f\xd7\x47\xe7\x8e\x7f\x55\xbd\x67\x89\xfa\xaf\xd7\xb7\x66\xea\x6f\x11\x7f\x67\x56\xbc\xc8\xeb\xe0\xaf\xae\x5f\xcf\xf7\x73\xcf\xf2\x13\xbd\x6a\x5c\xd9\x78\x68\xaf\x0d\xaf\x19\xf3\x5a\xa9\x1d\x2e\xae\xa7\x7f\xf9\x0a\x37\x3a\xcb\xf9\xdf\x99\x5c\x5c\xd4\xef\xab\xec\xa7\x38\xbe\xe7\xfa\x71\x5e\xbb\xbe\x81\x9c\x2f\xd2\x79\xac\xe9\xfc\x61\x89\x71\xae\x3a\x7f\x5f\xaf\xf9\x29\x76\xc4\x2b\xf4\x03\xc5\xf4\xf4\xa1\x2e\x6d\xcf\xf4\xa2\x7a\x07\x5f\x7b\x72\x78\x91\xbf\x6c\x79\xfc\x26\xe7\xc7\xf7\x35\xd3\x97\x39\xdd\x85\xdf\x91\xf3\xdf\xc3\xb5\xf5\xbf\x2c\x9f\x5d\xb4\xbe\x6b\x3c\xc7\x91\x53\x78\x79\x33\x1f\xff\xa9\xfe\x8d\x18\x9e\x96\x3a\xb7\xce\xb6\xcb\x33\xcf\x59\x78\xfd\x90\xcf\x33\x7b\x6a\x9e\x7f\x63\xc5\xfd\x91\x69\x1f\xbe\x61\xff\x45\xea\xaf\xac\xc7\x2f\x7d\x9e\x11\xed\x87\xe9\xd3\x6f\xa4\xb7\xd4\xfa\x30\xb9\xf4\x13\xec\x11\xeb\x35\x7c\x68\x3e\x3c\x7b\x7e\x7c\xca\xaa\xfe\x9c\x68\xfd\x2c\xbb\x25\xdb\xcf\xb2\xac\x9d\x69\xfd\x9c\x73\xdf\x8c\xb8\x85\x59\xfc\x6b\x91\x7f\x87\xf3\xf9\xb6\x27\x2f\x67\xeb\x5d\xb3\xe6\xb9\x48\x4f\x8b\x9c\x33\xaf\x95\xff\x2c\x81\x7f\x56\x6f\x55\xff\xca\xb2\xeb\x9a\xc1\x2f\x32\xf5\xe4\xd7\xf9\x27\xac\x40\x0f\xe5\xeb\xb2\xe8\xbc\x3d\x29\x37\x56\xf7\x07\xbf\x8d\x1e\xe7\xea\x8b\xcb\x9e\x4f\x66\xa6\xb3\xe2\x2f\x33\xea\xfb\xf8\x5b\x14\x7f\x97\xa4\x47\x39\x6b\xfd\xe3\xfb\x2c\x7d\xde\xb7\x06\x3f\x54\x12\xce\x9b\xe2\x51\x33\xe4\xfb\x6c\xfd\x39\x62\xb7\xfa\x76\xf5\x4f\x88\x93\x9d\xb3\x7e\x4b\xc5\x33\x65\xe6\x47\xe2\x9d\x23\xf3\x9c\x0d\x27\x89\x8f\x65\xfb\x59\x01\xdf\x99\xfd\x63\xaf\x5e\x64\xff\xfa\xa9\x12\x7e\xb7\xe8\xba\x2b\x1e\x1d\xd4\x59\xfc\x37\xcb\x3f\xf1\xe2\xea\x89\x27\x62\xbf\x84\x22\xf7\x8a\xa6\xc3\xf0\x3e\x87\xbf\xa4\x45\x8f\x94\x62\x74\x76\x38\xe3\x15\x28\x1f\xee\x90\xea\xfb\xcd\x34\xdf\xbf\xf2\xec\xc5\xcf\x33\xca\x93\x69\x5a\x8e\x04\xf3\x1d\xc4\xf1\xb6\x88\x5f\x73\x3e\x76\x96\xa0\x57\xbf\x3d\xf3\x73\xb3\x7b\x08\xc1\xfd\x84\xbd\x84\x9d\xeb\x8f\xcb\xb3\x77\x97\xe0\x5f\xe1\xb9\x09\xbe\x0e\xef\x01\xb1\x54\x4d\x7c\xcf\x4a\xe3\xf5\xb4\x44\xba\xb8\x3d\x4b\x57\xf5\x5f\x2f\xcf\x3f\xf9\x79\x9f\x7f\x3f\x83\xe3\xd3\x9c\xb9\x9e\x97\x5e\xfc\xc3\xbe\x9b\xe1\xaf\x08\xea\x79\xf4\xe9\xdf\x27\xf0\xe1\x36\xc3\xfb\x22\x8b\xfc\x47\xcb\xef\x37\x1f\x7e\xd0\x3e\xbd\xee\xfe\x37\x4f\xcf\xa2\xf4\x91\x91\xc6\xda\xcd\xaa\x37\x8b\x5e\x92\x7c\xe5\xd2\x8d\xf0\x3b\x8e\xf7\x61\xec\x5e\x4c\x2c\x7d\x15\x3f\xe4\xed\x16\xed\xc3\x4e\x64\x5d\x82\x76\xc5\x70\xbd\x12\xf5\x22\xf7\xdd\x48\x6c\x5d\xc3\xf5\x4d\xb6\xf7\xc7\x31\xcc\xba\xf7\x13\x1f\x6f\xc6\x7c\x17\xcd\xbf\x93\x98\x6f\x72\xfe\x8b\xf0\x14\xc2\x4f\xf6\x3f\x4c\xcc\xeb\x15\xf8\x5f\xb5\x7d\x12\xdf\x73\xca\x5f\x9f\xae\x40\x4f\x2b\xe9\x17\xe1\x79\xe2\x72\xe3\x1e\x61\xa5\x3b\x13\x5e\x36\x9c\x65\xf5\x80\x2e\x3e\xec\xcc\x87\x9f\xa9\x77\xbc\x56\xdf\xf4\xe5\xcf\x7c\xfe\xf1\xaa\x34\x9b\x1f\xac\x23\x7d\xf5\xb8\x3a\x8b\xe1\x27\xf7\xd7\x2b\xc6\xb7\x68\x9f\xac\x04\x67\x29\xb8\x11\xbe\xb4\x14\xff\x9d\xb3\xbf\x33\xbf\x87\x89\xfd\xf7\x3a\xfe\x1e\x8e\x6b\x0d\xfb\xbb\x12\xec\x93\xc3\xa4\x1c\x98\x37\x1f\x5e\x9f\x8d\x83\xb5\x0b\xf6\x1b\xe6\xe9\xdb\xf8\x53\x6c\x5c\x2b\xcb\xb3\x55\xd3\x4e\x42\x3e\xd1\x7e\x68\xbf\xb1\xfc\x95\xfa\x5d\xcb\xfc\x33\xe8\x7d\xad\xf3\x8e\xac\x7b\x66\x1a\xa1\xb3\x51\x6c\x3d\x12\xe5\x7c\xbd\xfd\x7a\xc5\xa0\x3c\xa0\xa7\xc4\x7e\x39\x4c\xef\xd3\x64\xbf\x2c\x6d\xe1\x14\xbc\x51\x16\x5f\xf7\xe9\xce\x7f\x7a\x69\xbd\xf2\x31\xe9\xba\xac\xf0\x38\x9d\x48\xff\x5c\x4e\x31\xbb\x21\x22\xff\x12\xdf\x6f\xe1\xff\x4b\xca\xdd\x75\xd1\xc5\x9c\xf9\xbc\x02\xde\x02\xbc\xcc\xf9\xfe\x09\xf3\x59\xe3\xfe\x59\x03\xbc\xb7\xeb\xf7\x2c\x7d\x93\xbf\x64\x16\xbc\x25\xfc\x1b\x73\xfc\x27\x2b\xf9\xe7\x56\xd0\xb3\x96\x9d\x47\x18\x8f\x90\x84\x1f\x9c\x17\x16\xa9\xdd\x79\x39\xd3\xff\x98\x79\x0e\x96\x8c\x6b\x9c\x99\xbe\xd1\x6f\xbd\xc2\xf9\xf3\xdc\xfb\x22\x49\x7f\x45\x76\xfb\xe5\x8e\x86\xd3\xfe\x28\xdf\x5f\xd3\xd4\x82\x78\x38\x56\x3f\xc2\x37\x33\xf7\x75\xa4\x3d\xbb\xc7\x1c\x3b\x4f\x88\xaf\x23\x7f\x72\xa8\x13\xc4\x99\xb5\x83\xfe\x92\xe3\x79\x83\xde\xbe\x48\x0e\x2e\x97\xae\x0b\x4e\x3a\xfd\x89\xe3\x5f\x15\x5f\xcb\xc3\xc3\x45\xba\xde\xe7\x3c\x5f\x3e\xc0\xcd\x01\xfe\x3c\x83\x1e\xd8\x37\x6f\x9f\x5d\xee\xa5\x0d\xda\x0f\x83\x23\x7f\x4d\xa5\x29\x3f\x57\x37\x52\x8e\xcb\xde\x38\xfc\xfa\x07\xb8\x31\x88\xe0\x57\x3e\xa7\xf9\x5d\x56\xde\xa0\xe5\x91\xef\x19\xfd\x2d\x9d\x36\xde\xd8\x3e\x33\x4d\x8e\x37\x56\x9e\x31\xee\x73\x5a\x2f\x72\xae\xc6\xfc\xb3\xe7\x2e\x5f\x97\x66\xe7\xa7\xcf\x7f\x16\xbc\xf3\xac\xfa\xb1\x7a\x72\x97\x7e\xb3\xf5\xfa\x9c\xa0\xc7\x75\xe3\x95\x9f\x7b\xac\x75\x9d\x66\xa4\x74\xfc\x31\x7a\xfc\x3a\x6f\x5f\xad\x75\x7e\x01\xfe\x96\xe7\x2f\xdd\x0e\xa7\x9f\xc5\xe9\xcf\xe0\x7f\xf3\xd6\xf9\x0d\x70\x33\xf5\xed\x39\xfc\x25\x99\xae\xd4\xdf\x1a\xd6\xef\xb5\xf4\xf1\x5a\xfc\xbc\x76\x9c\x8d\xd5\xe9\x71\x7d\x72\x6b\x35\x3d\x8b\xe9\x1f\xab\xc5\x49\x2e\x38\x1f\x7f\x9d\xfe\xb1\x94\x5e\x1e\x8f\xbf\x99\xfb\xae\x40\xf2\xfd\xb3\xb7\xa6\xaf\x8a\x5b\x8b\xc4\x03\x47\xf4\xb4\xd7\xcf\x7f\x0e\x5e\x32\xfb\x5f\x69\x7e\xcb\xf6\x97\x01\x77\xa5\xf3\xa8\x88\x7d\xf4\x5a\xbb\xe9\xb5\x71\x7a\xb1\x7b\xed\xd9\xf9\x6b\x88\xa7\x09\xe7\x33\x67\x5c\x7c\xbe\x66\xc6\x7c\x5f\x37\x0e\x7e\xaf\x8a\xdd\x9f\x9a\x1d\xdf\xf1\xb3\xe3\x88\xb2\xd7\x65\xc9\xf8\x9b\xd7\xc6\x87\xa4\xec\xbe\x90\x4e\x71\x65\xe6\xfd\x83\x6c\x78\x74\x7f\xfe\x9c\x78\xaa\x45\x7e\x80\xb5\xde\x6b\x89\xc4\x8f\x25\xf7\x57\xc4\x8e\x0c\xf7\xdb\xdc\xf7\x9f\x52\xe7\xe1\x89\xf8\xc5\x39\x46\xf3\x9c\xf8\xb1\x64\x1c\xe8\x2c\xfc\xbe\xe9\x3c\x7f\xd1\xfe\x8e\xc4\x27\x2d\x9a\xff\x41\x60\x6f\xaf\xe7\xfe\x59\xf2\xde\xd7\xaa\xf7\x58\x43\x38\x7e\x9c\x65\x46\x3f\xfe\xfa\xbc\xe9\x3c\x2f\x12\xc7\xbb\x44\xfc\xec\xec\xfd\xb4\x68\x1f\x64\xfb\x7f\x96\x8a\xcb\x5a\xb4\xfe\x4b\xf8\x7f\x5e\xe1\x9f\xca\xa4\x47\xf6\x2e\x9f\x3f\xcf\x15\xe2\x67\x3f\x63\xf9\x33\x6e\x76\xf1\xe7\xce\x9b\xd3\xee\x9a\xe0\x7c\x5e\x4c\x17\xab\xdf\x8f\x8b\xac\xf7\x5a\xef\xc7\x45\xc6\xc5\x9f\x12\xd4\xd6\x9b\x2e\x6f\x9f\xac\xc7\x4e\x4d\xea\xfb\xcb\xfb\x47\xb3\xf7\x53\x7c\xdd\xae\xa8\xdc\x9c\xfd\xce\xa3\x5c\x59\xe2\x3d\xc8\xc8\xfb\x8f\x91\xef\x23\xd7\x7f\x27\x32\x9e\x66\xc3\x59\x51\xce\xbe\xc2\x7f\xbf\x1c\x7f\x5b\xb3\x5e\xd4\xc4\xdc\x6f\xb7\x42\xfd\xe5\xc7\xf1\xe6\xf8\x8c\x45\xf0\xd5\x00\x7f\x2b\xe8\x61\xfb\x18\x9f\x63\xb9\xe1\x6d\x1a\xa6\x87\x72\xbf\xe5\x5b\xe2\x7f\xe3\xf6\xee\xa2\xf3\x32\x56\x2f\xe2\x47\x8d\xed\x1f\x56\x2e\x33\xff\x1f\xf3\xfb\xf9\xe7\x97\x49\x78\x73\xfc\xda\xd7\x54\x5f\x8f\xd9\xdd\x4b\x9c\x37\xbc\x35\xe5\xeb\xc0\xfc\x04\x97\xde\x78\xfc\x71\x8c\xa2\xf3\xf6\xe7\x37\x97\xff\xf0\x78\x54\x7f\x5e\x97\x6b\xf3\xab\xc9\x57\x14\xde\xf9\x9b\xfd\x26\x71\xbf\xd6\x97\x70\x5e\x57\xdc\x8f\x1e\xa4\xdd\xc0\x9f\x9b\xed\x87\xfb\x49\x7e\xcb\xc6\x00\x9f\xcf\xf0\xbb\x66\xfa\x4d\xf9\x7e\xcb\xf0\x7b\xda\x29\xff\x0f\x8b\x77\xf5\xf1\xc7\xe3\x5a\x33\xed\xe3\xb9\xe7\x6d\x41\x10\x73\x71\x39\x7e\xf2\xb6\x77\x39\x5f\x45\xef\xe1\xbb\x5c\x2b\xf4\xb3\xc2\xbb\x71\x6b\x7c\x7f\x20\x86\x5f\xdf\x6e\x7a\xab\x9d\x9e\xa9\xb7\xae\xea\xd7\x59\x21\x5d\xca\x9f\x13\x7f\x07\x7d\xb1\xdf\x26\x32\xee\x37\xd9\x15\xd9\xe9\x1a\xe3\x13\x2a\x81\x7d\xb7\x56\xbe\xbc\xec\x7c\xde\xea\x57\x9a\xa5\xbf\x2d\xeb\xef\x5a\x81\xbe\xdf\x00\x67\xb6\x9f\x63\xdd\xf2\x90\xed\xc3\xec\x75\xc8\xac\x9f\xf4\x6b\xbf\xd6\x6f\xf8\xda\xf5\x7a\xeb\xba\xac\x7b\x3c\x6f\xd0\x7b\x17\xf9\xaf\x5e\xaf\x7f\xfa\xf8\x5f\xc3\x7c\x93\xef\xd5\xad\xe5\x9d\x0f\x7e\x8e\xff\xa6\x71\x45\xf8\xec\x22\x7a\x7c\x15\xfe\xdf\xea\x3f\xce\x7c\xe7\xef\x27\xec\x87\xe4\xfe\x5d\x17\x3d\xaf\xe1\x77\xa8\x66\xcd\x3b\x79\xdf\x30\xc9\xdf\xd3\xf7\x88\x5f\xf7\x4e\xe4\xac\x75\x89\xf9\xef\xe3\xfd\xcf\xf0\xe7\x67\xd3\x45\x46\xdc\x52\x3b\x7b\xdf\xae\x77\xdd\x7d\xfa\x5f\x29\x7f\x85\x34\xe9\xff\x8d\x95\xa7\xe6\x3b\xdb\xff\xf8\x26\xfe\x10\x39\xe7\x88\xf5\xf7\x86\xf5\x3e\x0a\xfd\xce\x4b\x9e\x8b\x2d\x07\x6f\x7d\xf3\xff\x39\x7e\x95\x25\xe4\xc5\x8c\x73\x9b\x59\x76\xd2\x0a\xfd\xaf\xf2\xde\xc1\x8c\xf4\x15\xe7\xc3\xb3\xfc\x1f\xfe\x7c\x56\x8c\xef\x7b\x33\xbe\x97\x7f\x1f\x62\xd6\x7e\x5c\xe2\xbc\x66\xd1\x7b\x7a\x4b\xcd\xf7\x75\xfc\x82\x44\xcf\x05\x33\xed\xe8\x48\xfd\x48\x5c\x26\x89\xbe\xdb\xc0\xea\xcf\x7d\x1f\x81\xff\xce\x5d\x68\x37\xae\x41\xce\xbd\x75\xfe\xaf\x78\x3f\x3c\x23\x8d\xc5\xa1\xb2\x38\xe3\x15\xde\x77\x5b\x7e\xde\xf3\xf6\x4d\xf1\x0d\xfc\x6b\x85\x73\xda\x15\xf8\x41\xec\xfd\x89\x39\xfc\x32\xe4\xcb\x2b\xf3\x87\xb0\x9f\xb8\xbf\x27\xd4\x9f\x93\x74\x3c\x87\x2f\x64\xc0\x49\x9f\xa7\x2e\xf1\x6e\x47\xc6\xfc\xd3\xe7\xf2\x11\xb9\x78\xa0\xcd\xe7\x2f\x2c\x3e\x26\xc3\xff\x1c\xea\x0b\xd9\xfd\xaf\xff\x7d\xab\x99\x78\x99\x45\x3f\xa7\x41\x3c\x77\xe4\xdd\xda\x4c\xbd\x2b\x23\x4d\xf6\xeb\xcf\xdf\xe7\x3f\x8b\xe4\xed\x0a\xf1\x15\xe1\x3b\xbc\xb3\xd2\x57\xf8\x6d\x56\xe8\x7f\xf9\x74\x3d\xef\x3e\xfb\xf0\x56\x7a\x27\x69\xd1\xfe\x67\xf0\x03\x39\x65\x2e\xfc\x3d\x92\xd5\xf5\xa7\x45\xf2\xf4\xad\x7a\x79\xf6\xbb\x2e\x31\x7a\x8e\xd3\xef\x69\xd4\x9f\x96\xe6\xbf\xf3\xf9\x6a\x26\x1f\x5c\x4e\xde\x24\xf5\x3c\xa6\x17\x04\xf4\xfa\xc6\x7b\x0f\xcb\xeb\x4f\xeb\xf1\xc7\xcc\xd2\x87\x66\xbd\xb3\xb3\xec\xfd\x8e\xd5\xe9\x6f\x26\x3d\x9e\xf2\xdf\xef\x7a\x85\x9e\xb2\xdc\x3a\x2e\x5f\x6f\x05\x3b\x67\x55\xfd\x62\x89\xfd\x10\x93\xa3\xb3\xd7\x89\xcb\xe9\xcc\x75\x59\x41\x7f\x78\x2b\x5d\x85\x7a\xc5\x2b\xf4\xc3\xa4\x7f\x60\xd9\xfd\xb1\xc6\x7d\xf7\xd6\xf9\x5f\x60\xb9\x85\x1b\x1a\xee\xb8\x72\x1d\x37\x62\xf4\x5b\x0f\xea\xf1\xf2\x56\xa2\xfc\xad\xfd\x26\xfb\x7b\xbd\x3e\xff\xba\xf5\x7b\xe5\x7c\xd6\xb0\x6e\xcb\xd1\x77\x3b\x4b\x5f\x7f\xab\xfd\x9a\xc1\x6f\xe6\xd2\xed\xdb\xec\x83\x62\xf6\x7b\xf7\x91\x76\xcc\x3e\x7c\xad\x7e\xb4\xaa\xfd\xb3\xc2\xba\xfe\x54\xba\x58\xa1\xdd\xeb\x7f\x4f\xf5\x0d\xf1\x9f\x73\xed\x94\x25\xf0\x11\x39\xef\x5f\xa3\x7e\xb1\x44\x1c\xd9\xea\x70\x5f\x77\xff\x6a\xd1\xfa\xae\xf9\x5e\xd9\x12\xfb\x7b\x55\xfe\xb7\x12\xff\xe0\xf5\x48\xe8\xc7\x58\x32\x3e\x7b\xb5\xf4\xf5\xe7\xd5\x73\xe0\xce\x3a\x87\x5f\xc3\xf9\x78\x23\xea\xd7\x62\xf9\x6f\xd8\x8f\xb3\xda\xbf\x61\x9c\xe9\xf1\xfd\xac\x38\xc0\x64\x9a\xbc\x47\xff\x4f\xd3\xc7\x9c\xf9\xbc\x4a\x5f\x5f\x6e\xfe\xaf\xa2\xe3\x75\xc5\x6f\x24\xef\x29\x74\x13\xfe\xae\x70\x5f\xc7\xf7\xf9\x62\x3c\xce\x79\x37\xe0\xa7\x8c\x3b\x82\xf7\x15\xec\xcb\xa3\xac\x77\x04\x63\xfe\xbe\x6c\x3e\xb7\xd2\xf8\xd6\xf3\xfb\xc7\x7f\x53\xbc\xd2\x9c\x74\xd1\xf8\xde\xba\x9e\x3f\x71\x7e\x8b\xf4\xe9\xb7\xa6\x6f\xd2\xaf\x66\xc9\x8b\x25\xea\xc7\xf8\xf8\x7c\x39\x94\xf4\x97\x2e\xcf\x6f\x5f\xe7\x5f\x78\xa5\xde\xf8\x8a\x7e\x92\xfe\xfb\x6c\x38\x2b\xf9\xdb\x97\xb5\x9f\xe6\xea\x51\x8b\xce\x3f\xb2\xf5\x8f\x05\x78\x5c\xee\xfc\x90\x5d\x55\x5b\x8b\xbd\x33\x8b\x8f\xc6\xe3\x7f\x96\xff\x1d\xce\xf8\xfb\xce\x49\x7d\x34\x86\xe7\x48\xdc\x52\xfa\x77\x6a\x33\xfa\x4f\xd6\x4f\xfe\x7e\x6d\xc6\x38\xe6\xda\x85\xb3\xc6\xbd\xd4\x3c\x97\x48\x33\xe9\xea\xad\x71\xef\x2b\xeb\x5f\x4b\xd5\x5f\xfc\x8e\x58\x10\xf7\xbe\xea\x3b\x8c\x24\xf1\x0e\xdc\xf2\xef\x2d\x66\xbf\x23\xb7\x38\x7d\xf5\x3b\x11\x77\xf8\xa8\x83\x1f\xde\x98\xc6\xe0\xb2\xf7\xe7\x5e\x3b\x1e\xbe\x7e\x6f\x7a\xff\x22\x89\xc7\xf8\x3b\x8b\x2c\xd5\xbc\x77\xef\x62\xe3\xf5\xdf\xc1\x5b\xf7\x3b\x44\xad\x0e\xbe\xc5\x4a\xc3\x4b\xc3\xfe\x93\xef\xef\x65\xa4\xab\xf5\x93\xd9\x0e\x47\xe7\x3b\x0b\xbe\x96\x05\x27\x89\xa7\x37\xe0\x81\x78\xeb\x12\x7b\x0f\x31\x32\xbe\x64\xbd\xe4\x7a\xcd\x5e\xe7\xb8\x5e\xb0\x2a\x9d\x65\xea\x15\x4b\xcd\x67\x69\xbb\xe6\x0d\x74\x83\x53\xeb\xb2\x6a\xfb\x18\x9e\xdf\xb0\x8e\xaf\xc5\xd3\x62\xbc\xcf\xa1\xe3\x0c\xba\xd6\xde\xa2\x8f\x07\x47\xbc\xde\x3b\xfb\x19\x74\xa3\xbd\x66\xbf\x2d\x87\xff\xd5\xcb\x57\xa5\xdb\x39\xe9\x5b\xe9\xf9\x55\xfd\xbf\x75\xdf\xad\xb0\x9f\xd6\xb8\x1f\x93\xfc\x31\x73\xdf\xcc\xa1\x93\xd9\xfc\x7c\xd6\xbe\x5e\x2e\x9d\x2b\x27\x7e\x8a\xdc\xe2\xe9\x92\xfe\xe7\x15\xee\x25\xfb\xe9\xba\xe1\xb1\x74\xdd\xf7\xf7\x96\xc2\xd3\x1a\xc7\xff\xba\xd4\x5a\xb3\x3f\x7a\x96\xdd\xb9\xe2\xb9\xfb\xfc\x54\x98\xc2\x9b\xb1\x31\x70\x74\xd3\x10\x31\x24\xd0\x01\x2f\xc2\xd8\x26\x1b\xb6\x63\xe9\x03\x47\xa8\x9e\x5e\xff\x41\x06\x4e\x61\x48\x6e\x74\x83\x9c\x59\xe6\x03\xb1\x9c\x67\x91\x40\xe1\xc7\x0f\x62\x9f\x98\xc3\xf1\x88\x08\xf0\xe5\x51\x1d\x8d\x89\xb4\x59\x9c\x82\xea\xa3\x6a\x6d\x58\xc8\x11\xdf\x81\x2a\xa1\xcd\xd4\xf1\xc8\x41\x7e\x17\x1b\x58\x24\xd0\x81\x06\x78\xd9\x8c\xf6\x0a\x5e\xf4\x1b\x71\x53\xc4\x1b\xba\x61\x3b\xaa\x31\x20\xe6\xcd\x06\x01\xc0\xb9\xb5\x4c\x77\xc3\x20\xee\xc6\xe5\xf3\x03\x69\x58\x96\x69\x89\x82\xa2\x1a\x86\xe9\x6c\x0c\xd4\xd1\x68\x43\xdd\x18\x8c\x54\xdb\xde\x50\xed\x0d\x75\xc3\x07\x28\x80\xa9\xe8\xdc\xea\x36\xc4\x00\xd2\xb4\xe0\x3c\x3f\x10\x64\x15\xce\xf0\xe5\x41\x41\x69\x9d\x2b\xc7\x0d\x9e\xff\x84\x08\xff\xe3\x19\x39\xfc\x0f\x4b\x1d\xea\x63\x1b\x19\xd3\x9f\x82\x14\x68\x04\x78\x10\xc1\x8b\x45\x9c\xb1\x65\x6c\xa4\xd0\x80\x2d\x4b\x7d\x2e\xe8\x36\x4b\x45\x0c\x80\x57\x11\x57\xf5\x1b\xf1\xe2\xf9\xfe\xda\x1c\x15\x74\x87\x58\xaa\x63\x5a\x1b\xba\xb1\xc1\xc7\x12\xa9\x18\x87\x48\x7b\x76\x50\xaf\x0f\x2d\xb4\x59\x84\x06\xda\x2c\x41\x19\x3d\x9a\xfa\x70\xa3\x58\x75\xac\xe7\x97\x1b\xd3\x12\x69\x1d\x15\xda\x08\xf7\x12\xf0\xfb\x22\xa8\x6e\x8a\x16\x12\x55\x64\x17\x0c\xf2\xe4\x88\x00\x14\x86\xa6\x41\x40\x2e\x27\x3a\x85\x87\xb1\x7d\x2b\xaa\x05\x36\x4f\x00\x37\xc9\x64\xe2\x14\x46\xc4\xd0\x9c\xdb\x4d\x84\x08\xa8\xd2\x2e\x41\x75\x3a\x50\x9d\xc1\xad\x88\xc1\x8b\x41\x87\x20\x23\x3c\xbd\xd1\x0d\x75\x34\x7a\x7e\xa1\x03\xd8\xb4\x72\x39\xbb\xc0\xc7\x1e\xfe\x25\x82\xa0\x92\x7e\x23\x1a\x1e\x29\xc8\xd3\xa9\x37\x49\x67\xca\xa6\x57\xcd\x24\x91\x96\xf1\xa8\x8e\xf4\xe1\x86\xea\x38\xe4\xfe\xc1\xd9\x70\xcc\x8d\x21\xb1\x1d\x6b\x3c\x70\xc6\x16\xd9\x30\x4c\x63\x8b\xcd\xf0\x7a\x44\x02\x8a\x13\xc0\x74\x2a\x02\x28\x47\x97\x28\x42\xb5\x0c\x97\x3e\xae\x1c\x54\xac\x3a\x1f\x89\x37\xd7\xaa\x93\xcf\x73\x3c\x5b\x88\xf4\x9c\x7e\xd5\x2a\x10\x63\x7c\xcf\xe1\xa3\xe8\xc7\x64\xb2\x59\x82\x56\x61\x60\x1a\x37\xba\x36\xe6\xe5\x9b\x45\x28\x30\x04\x0a\xba\xb1\x61\xe5\x72\xa2\x55\x70\x2d\xdd\xf1\xca\x00\xcc\x26\x35\x0c\xad\xc2\x1d\x79\x86\x16\x08\x30\x12\x8c\x9b\x6e\x30\x2b\xa0\x2f\x27\x97\xc3\x22\x29\x3c\x58\xa6\x63\xd2\x8d\x00\x1d\x00\x2d\x96\x07\x2d\x00\x09\x9b\xb4\x8a\x1c\xb1\x0c\xa0\x8d\x44\x47\x2c\xef\x02\xe8\x88\xbb\x65\x00\xa0\x89\x1c\xf1\x03\x80\x3a\x12\x2d\x64\x82\x5c\xce\x2a\x84\xe4\x5d\xb3\xa4\x17\x6f\x73\x4b\xd6\x14\x0e\x90\x23\xee\x02\x38\x42\x8e\x58\x2a\x73\x72\x1f\xcf\xc0\x24\xdb\x4d\x7f\xe7\xee\x57\x2d\x8d\x38\xfe\x56\x37\x1f\x68\x25\x1b\x39\x90\x14\x2c\x62\x0c\x89\x25\x3a\xc0\x47\xa1\x2c\x62\xd8\x7b\xb9\x23\xcf\x92\xc0\xcb\xda\xe6\x90\x08\x90\xef\xe3\x70\xc4\xe0\x05\x17\x74\xfb\xb3\x6e\xeb\xd7\x23\x22\xb2\xad\xc0\x98\x47\xd0\x44\x56\x07\x77\x9a\x65\x8e\x8d\x21\x36\x86\xb2\x69\x0d\x89\x65\x8b\xfe\x78\xc2\x6a\x8a\x69\x38\xc4\x60\x5b\x77\x3a\x85\xc9\x7e\xbd\xd2\xac\xee\x29\x7a\x09\x62\xb3\x74\xa2\x58\xa6\xdc\xa3\x30\xb8\xd5\x47\x43\x0a\xc0\xf6\xe8\x33\x97\x8b\x65\xde\x98\x56\x43\x1d\xdc\x8a\x41\x3b\x87\x35\x74\xa2\xd8\xd7\x7d\xc6\xed\xd3\xb5\x53\x78\x50\x2d\x62\x38\x05\xdb\x79\x1e\x91\x2a\xf1\xb0\xea\x4d\xe6\x92\x3c\x39\x14\xb8\xe8\x14\xae\xe9\xac\x6d\x46\xe4\x23\xd3\x82\x56\xe1\xc6\x34\x1c\x68\x15\x1c\xf2\xe4\xd4\xc9\xc0\xb4\x54\xda\xa7\x97\x71\x71\xab\x0e\x4d\x17\x4c\xc9\xc8\x26\x1b\x01\xcc\xa1\xa5\xba\x17\xb7\xea\x03\x11\x1d\x88\x79\x87\x1c\x1a\x98\x02\x88\x0b\xfa\xbd\xaa\x05\x7c\x8d\xf8\x0b\xca\xb3\x2f\x1c\xd3\x22\x05\x8d\x38\xa2\x5f\x8f\x32\xcd\x60\x16\x62\x11\xaa\x85\x81\x3a\x1a\x8c\x47\xaa\xe3\x23\x58\x36\x9f\x80\x88\xfd\x81\xfb\x1d\x3e\xa8\xc3\xa1\x6e\x68\xc1\xf7\x35\x5b\x45\x00\x0d\x24\x18\xe3\xfb\x6b\x62\x09\x08\xd1\xed\x64\xde\x6c\x38\x05\x57\x1f\x52\x34\x7b\x7f\x7c\x2a\xd6\xbc\xbf\x24\x8b\xa7\x50\xce\x6a\x75\x4b\x74\xed\xd6\xa1\xcd\xf8\x5f\xac\x1d\xff\x53\xb2\xbc\x3f\xaa\xc6\xa7\x62\x2e\x27\xd3\x7f\x02\xfc\x0c\x46\xfa\x83\xd8\x8b\xcf\xe5\x8c\x0f\x57\x36\x9f\xce\x54\xe7\x96\xce\x67\x30\xb6\x1e\xc9\x50\x66\xb3\x02\x7d\x18\xa1\x92\x18\xa2\x5b\x14\x4b\xa2\x03\xe9\x36\x53\x0b\xbc\xba\x58\x84\x45\x68\x40\x19\x50\xf6\x02\xa6\xd3\x29\xb4\x10\xa6\x58\x55\x46\xfa\x03\x85\x6f\x8b\xa0\x6a\x79\xd4\x55\x8b\x6c\x32\x3e\x34\x0b\x3a\x40\x72\xc4\x2c\x9a\xce\xda\x18\x0b\x09\x7c\x33\x58\x83\xa0\x75\xe4\x4f\x85\x52\x46\x41\xb7\x2f\x2d\xd5\xb0\x39\x91\x8a\x60\x32\x99\xdb\x86\x4d\xda\x1b\x3f\x9b\x5b\x74\x8d\x0b\xb6\x79\x4f\xc4\xe8\x68\x7c\x01\xec\x55\xb8\xa0\x95\x37\x11\x1a\x15\xe4\xd3\xf3\x7a\xe3\xfc\xc7\xc5\xe5\xd5\x71\xa3\xd0\x3e\x6d\x37\x72\xb9\x4d\xbf\x56\xe6\xb8\xa6\x20\xae\x03\x04\x64\x39\x08\x97\x32\xc0\x91\x76\xa6\xea\x86\xa3\x1b\x1a\xb6\x88\x9a\x5c\x52\x38\x1f\x29\x23\xfd\x01\x54\x9d\x14\xd1\x58\x31\x42\x78\x0d\x5e\x03\x80\x37\xfa\x68\x24\x2e\x86\x00\x02\x3e\x2b\xc7\xd1\x2f\x62\xbe\x9d\x63\xa8\x4f\xf3\x26\x2a\xc9\x9c\x28\xe2\x51\x26\xe2\xa9\xe6\x31\x07\xef\x74\xdc\xde\x28\x58\x25\x0a\x17\x26\xf6\xc8\x14\x4c\x19\xb3\x98\x4c\x2c\xbe\x30\x32\xc2\x1e\xd7\xab\xf9\x7f\x24\x36\x81\xd4\xeb\x57\xe5\x99\xfb\x40\x86\x06\x90\xa8\x22\x93\xd8\x08\x09\x44\xcc\xa7\xff\xea\x12\x84\x6c\x8f\xf4\x01\x11\x8b\xa0\x60\x91\x47\x62\xd9\x44\x04\x99\x4c\x5e\x18\x5b\x23\x01\x21\xe4\x14\x6c\x73\x6c\x0d\x48\xe1\x9e\x38\xb7\xe6\x90\x32\x20\x2f\x43\xb5\x34\x5f\x68\xd4\xd2\xcb\x76\x4e\x1e\x88\xea\x88\x98\x6e\xef\x6d\x8d\xaa\xca\xc4\x70\xb6\xf5\x82\x43\x6c\x47\x4c\x00\x05\x94\xf4\x92\x00\xf6\xbd\x36\x0c\xc4\x34\xc9\x1f\x92\x1d\xa5\xf1\x12\xaa\xb3\x51\x51\x9e\xe4\xfc\x24\x3a\x9b\x5e\xb1\x9f\x12\x01\xd9\x7b\xcd\xb4\x75\x0a\x2e\xb2\xdd\xe6\xe0\xfd\xd4\xd2\x35\xdd\x80\x2b\x48\x8d\x19\xfd\x0e\x2f\xf4\xbf\x08\xf0\x54\x36\x28\xcf\xac\xe6\x0f\x0f\x50\x55\xce\xfb\x1b\x1a\xb4\x8d\x3a\xb3\x0d\x47\x23\x97\x07\x04\xca\xb4\x7a\x30\x62\xaa\xec\x9d\xa8\xce\x6d\x81\xd5\x14\x29\x33\xbf\x71\xf2\x72\xe1\x89\x6a\x7d\xb1\x02\xc7\x7c\xc8\xcb\x85\x67\xaa\x69\x87\xf4\xcd\x57\xcc\x23\x08\x95\x1a\x74\xd0\x86\xe6\x1c\x4a\xf7\x97\x7e\xde\xa2\xfe\x33\x4b\x93\x24\x09\x7f\xa4\x19\x4b\x34\x6f\x1d\x33\x17\x88\x4a\x42\x28\xa3\x98\x6c\x8d\x20\xd7\xe1\x58\x37\x28\xd6\x63\xd9\x14\xe7\x46\xe1\x19\x40\x5f\x7f\xf0\xd5\x01\xba\x3a\x62\x11\xda\x94\x1d\xd9\xc1\x50\x01\xc5\xa2\x47\xf5\x50\x66\xf4\x6e\x02\xdb\xd5\xa9\xd5\x65\x32\xeb\x17\xbc\x0c\x54\x6a\xbe\x16\xf6\xcf\x71\xbd\xd5\x68\x5f\xfe\xb8\xbc\x3a\x6b\x14\x8e\x5b\xed\x06\x3e\xff\xe1\x67\x4a\xe9\x25\x3e\xd6\x0d\xa2\x5a\xc1\xc6\x95\xa1\x09\xaa\xd7\x16\x51\xef\xaa\x99\x00\xe9\x07\x3e\x9e\x07\xf0\x5c\x1d\xea\xea\x28\x06\x30\x45\x35\x6c\x65\xb2\x28\x85\x5a\x0e\x51\x90\xa1\xa6\xc8\xb4\x21\x86\x14\x4a\xef\x4d\xd3\x03\x02\x44\x07\x12\x00\x63\x32\x39\xc9\x77\x2e\x1c\x75\x70\xb7\x80\x09\x73\xc5\xda\x34\x1c\x55\x37\x88\x15\x55\xfe\x7d\xe2\x65\xfa\xd1\xe9\x83\x3a\xd0\x9d\x67\x11\x54\x9d\x4d\xc4\x99\xd4\x0f\x93\xe7\xf9\x46\x82\x37\x72\x3b\xac\x1c\x6f\xe9\x19\x09\x7e\x33\xe4\xf8\x0e\x95\x68\xff\x9c\x82\x1d\x2a\xe1\x6e\x4c\xeb\xbe\x6a\x8c\x47\xa3\x4d\x84\xac\x98\x0c\x0a\x8a\x63\x43\xe7\xbb\x82\x13\x9e\x15\xd6\xe1\xbb\xa6\x57\xec\x73\x63\x1e\x66\x34\xa1\x44\x99\x6e\x51\xf2\x5b\x44\x8a\x60\xda\xcb\xe1\x0b\x03\x86\xec\xd0\xee\x99\x02\x29\x62\x13\x25\x0b\xb3\x16\x6a\xa1\x55\xe4\x32\x43\x0b\x51\x33\x78\x97\xee\x6e\xa7\x57\xec\x43\x19\x39\xbd\x52\x9f\xda\xb9\xbd\x72\x1f\xda\xc8\xe9\xed\xf4\xa9\x79\xdb\xab\xf4\xa1\x8e\x3a\xb4\xc9\x00\x19\xa2\x0e\xcb\xd4\x86\x1d\xd0\x26\x63\x34\xe8\x95\xfa\xd5\xa5\x2c\xbb\x10\x59\x74\xcb\xda\xa6\xe5\x88\xdd\x50\x06\x27\x67\xc8\x56\x78\xb6\x31\x18\x05\x36\xce\x02\x42\x6b\x7b\x30\xec\x45\x9d\x98\x8b\x2a\x8c\x16\xf4\x20\x2f\x02\xa0\x2e\x39\xdf\xc4\x62\x66\x2d\x60\x4c\xaa\x27\xf4\xc8\x5c\x2e\xce\x4b\x06\x8e\x6a\x68\x23\x22\xc6\xda\x3c\xc5\x6c\xfc\xc2\x73\xfc\x93\xb3\xd2\x58\x16\xe7\xaa\x70\x5e\xc7\xb1\x85\x62\xf3\x11\x31\xdf\x93\x9c\x37\xf8\x43\xd2\x88\x73\xc9\xfe\xa2\xb6\x91\x47\xf4\xd3\x69\x1f\x40\x3c\x15\xa3\x9e\xd0\x31\x6b\xdb\x41\xd1\x89\xfb\x7e\x25\x82\x7a\x7d\xe8\x39\xeb\x3c\x9b\xdd\x22\x86\x6f\xa8\x18\xa8\x58\x35\x3e\x5a\x55\xc3\x77\x37\xc9\x91\x4a\x3d\x83\xaa\xa2\xba\xdd\x32\x46\xba\x41\x8e\xc9\x23\x19\x89\xa0\x46\xb8\x8b\x4e\x06\x92\xe3\xff\xe5\xf9\x3a\x7a\x04\x3a\xfd\x29\x74\x17\x8e\xa3\xd7\x87\x06\xfd\x47\xa6\xff\xa8\x1e\x1b\x22\x4f\x8e\xaf\x28\x42\x1b\x15\xab\xf6\x47\xb5\x6a\xfb\xc3\x32\x23\x95\x7a\x76\xbf\x6a\xc6\x38\xa7\x2f\x28\xc9\x90\xaa\xe5\x66\x8a\xab\x79\x8c\xef\x63\x29\x5e\xe8\x29\xf4\x94\xbd\xd0\x96\xb5\x74\xc3\xbf\x5a\xc6\x90\x3c\x15\xd8\x9e\xfc\x58\xf4\xa7\x6e\x02\x69\x7e\xd5\x4f\xc5\x9a\x15\x54\x75\x32\x1b\xe9\x76\x73\x64\xaa\xd4\x12\x13\x41\xcd\x08\xaa\xc8\xfe\x5f\x11\x94\x42\x8b\x1a\xce\xfd\x29\xec\xa2\xb8\x8a\x13\xd8\x90\x73\xc7\x42\xe6\x16\xd7\x4a\xd2\xfc\xf6\x1f\x17\xb4\xdf\x8a\x03\xd0\x69\x51\xac\x4f\x96\x53\x2b\x49\x5b\xa5\x75\x7b\xc0\x61\x44\x5e\x7d\x21\xd7\x77\xba\x13\xd7\x04\xb0\xa5\xd9\x88\xc4\xf5\x1a\x44\x0a\xf1\x4a\x88\x14\xe2\x0a\x09\xad\x11\x57\x39\x7e\x5c\x1c\xe0\xb3\x06\x22\x71\xc5\xc4\x77\x78\x73\x51\xfa\xcb\x09\xff\x1f\xee\x84\x37\x90\xa8\x8b\x8e\xb8\x03\x98\x2b\x9a\x26\x32\xa2\x19\x45\xc0\x7d\xd5\x25\x6a\xbe\xe8\xa2\xca\x5d\xd4\x15\x50\x0d\xdc\xcb\x7a\xd4\x5f\x93\xcb\xe1\xa8\xc7\x1a\x87\x1e\x6b\x3c\x9d\x06\x4d\x06\x3f\xc3\x05\x4d\x17\x73\x84\xb6\xff\x2d\x3a\xe6\x06\xa8\x89\x54\xdd\x9a\x38\xe6\xc3\xc4\xa2\xf2\x66\x72\x6d\x3a\x8e\x79\x0f\xc4\x8d\x19\x05\xa0\xf6\x3f\xdb\x3a\x1c\xd3\xf6\xbd\xfc\x56\xbf\xf6\x7d\xf8\xfb\xf7\x42\xed\xfb\x30\x0f\xfe\xb5\x91\xca\xa1\x55\x3b\x68\x5b\x7c\x78\x02\x93\x7f\x4d\xc4\x8d\x22\xa0\x39\x2e\x6d\x7c\x63\x99\xf7\x13\xc7\x9c\x30\xef\xe9\x96\xed\x98\x0f\xe0\xbb\x28\xd6\x24\xb1\xf7\x7d\x58\xe8\xe7\x81\xf8\x2f\x50\x83\xdf\xed\xdf\x41\x4d\x2c\xe4\x6b\xe0\x3b\x6b\xd9\x45\xdb\xff\xfe\x6e\xff\x2e\x0e\x74\x6b\x30\x22\x13\x32\x1a\xe9\x0f\x36\x01\x35\x9a\x17\x6d\xfb\xf0\x34\xb1\x6a\xe4\x7e\xf2\x2f\x40\x4b\x32\x0b\x40\x0d\x4c\x06\x23\xd3\x26\xb6\xb3\x65\xeb\x43\x12\x7c\x0c\x4c\xcb\x20\xd6\xe4\x46\xb5\x9c\xdb\xa0\x30\xf8\xe2\xa5\xbc\xc7\x9a\xa4\x3a\x1e\x7c\x86\xab\x01\x31\x1c\x62\x71\x74\x81\x49\x56\x9f\xdf\xed\x3c\xad\x4d\x91\xea\x55\xf6\xb0\x9a\x59\x1b\xd4\xc4\x9a\xf4\xdd\x9e\xfc\x0f\xd8\xd6\xa1\x96\xe2\x1b\x2f\x49\x13\xa9\x08\x93\x36\x4e\x69\x0a\x95\x99\x7c\xe8\x85\x9f\x37\x4a\x45\xd8\x38\x3e\x6e\x9d\x5d\x34\x68\xf5\x21\x7a\xa1\x73\x91\x28\x5d\xd9\xbe\x62\x20\x0a\xc5\x7f\x09\x00\x3a\xe6\x43\x66\x3e\x9f\x4a\xb2\x68\x97\x95\x31\x64\x24\x8b\x4a\x45\x56\xc6\xe7\x9e\x5d\x38\x85\xcd\x34\x47\x4d\x9e\xd4\x0c\x32\xce\x52\xb5\xa4\xe5\xc8\xcb\x18\x99\x5d\x38\xe6\x83\xed\x9f\xb6\x0c\x75\xaa\xa9\xe9\xa6\x81\x9c\x29\x6c\xa4\xf9\x79\xe2\x58\xd8\x82\xc6\xac\x0e\x13\xe8\x9d\xd5\xa1\x4d\xad\x41\xff\x34\x97\xe3\x0c\x59\x89\xb3\x5d\x78\x83\xc4\xa4\xa4\x49\xca\x3a\xef\x34\x8f\xf9\x90\xa0\x81\x7c\xb7\x16\x94\xa9\x8c\xb2\xc8\x8d\xfe\xe4\x29\x79\xc2\x88\xa1\x6f\xcb\xf7\x87\x09\x08\x21\xa3\x76\x2b\x5a\xd0\x81\x9b\x9b\x32\x90\x84\x58\x49\x2e\xe7\x35\xa0\x5f\x56\xaf\xd8\xaf\xdd\x8a\x3d\xc1\x31\x37\xf8\x3a\x09\x7d\x2a\x8c\x07\xaa\x23\x3e\x8b\x96\xe7\xd7\xdb\x01\x94\x0d\x7a\xc0\x2c\x86\xbf\x44\x6f\x07\x22\x86\xc2\x96\xcb\xa4\xea\x16\xcd\x92\x6b\x8f\xa2\x05\x24\xe6\x88\x4f\xf5\xcf\x41\x04\xfd\xd3\xc6\xcf\xe2\x63\xd0\x5d\x89\x75\x07\x24\x2e\x9d\xd2\x5a\x80\x2f\xaa\x3c\xcd\x90\x54\x8d\x8f\xd8\x3f\x08\x0d\x34\x53\x15\xe1\x9e\x41\x2d\xac\x0e\xf7\x0e\xaa\x00\xea\x48\x2d\x8c\x54\xdb\x61\xfa\xc8\xe9\x8d\x28\x6c\x08\xcc\xe8\x22\xee\x86\x1c\x10\xa6\x59\x53\x0b\xf6\xf8\x9a\x2a\x19\x86\x26\x16\xa1\x0e\x24\x95\x5a\x64\x66\x2d\x4e\xc0\xd1\x5a\x7a\xbe\x04\x80\x64\x20\x84\x48\x2d\x63\xe7\xb0\x12\x7f\x84\x5b\xa5\x64\x15\xbe\x13\x24\x6a\x41\x57\x3d\x3d\xf0\x85\x91\x95\x34\x80\x94\x61\x4a\xa3\x29\x98\xfa\x73\x1e\x23\xab\x70\xaf\x3e\x88\x69\xab\x13\xfb\xe7\x5d\xec\x30\xc1\x7c\xf0\xa8\xc3\x03\x45\x38\xa8\x22\x42\xc8\xa9\x15\x25\xab\x66\x51\x73\x01\x5f\xdb\xe6\x68\xec\x90\xcf\x54\x72\x8b\x0e\xd8\x76\xd8\x30\xa6\x53\x00\x5d\x34\xa6\xb6\x38\x6d\x05\xbb\xa8\x58\xed\x7e\x1c\xfb\x38\xee\xe6\xf3\x80\x0a\x63\x6e\xf2\xbb\x7c\x00\x1a\x1a\xf7\xba\xbc\x7e\xd5\x2b\x44\x08\x69\xe1\x6a\x29\xa8\x5b\xf5\x72\xc7\x3d\xc5\xab\x09\x94\x7c\xbe\xea\xd7\x18\x22\x65\xab\x9b\x2f\xc1\x26\x12\x83\x1a\x5b\x2e\xd8\x1e\x56\xbb\x1f\x15\xd6\xab\x1b\x76\x82\xdc\x7c\x93\x9f\xda\xb9\x48\xf3\xb5\x81\xf1\x14\xc0\xdb\x19\x3b\x49\x2c\x42\x83\x6f\x39\x4c\xcd\x36\x20\xe2\x5e\xb1\x4f\xc5\xfa\x88\x13\x08\xff\x54\x91\x3c\x99\xf8\xce\x8c\xc9\x64\x1c\x2d\xb3\x91\x5a\x0b\xfc\x1c\x0f\xa2\x53\xb3\xb6\x0a\xbb\xbf\x33\xb7\xd9\x59\x4b\xb2\x20\x01\x92\x5c\x6b\xb1\xca\xf4\xef\xa3\xe0\xaf\x07\xd1\xab\x04\x09\xa3\xc2\x5a\x49\x2a\xc2\x01\x77\x72\xde\xeb\x86\x28\x16\xa1\x59\x18\xea\x5c\xec\x03\x5e\x59\xbd\xb6\x45\xbb\xf0\x54\x04\xf9\xe8\x67\xc9\x73\xd3\xf1\xcf\xe7\x78\xe9\x73\x09\x00\x58\xfe\x9d\x78\x66\x26\xfd\xcb\xf3\xd9\xf9\xe6\x20\xa5\xbc\xa6\x78\x23\x62\xa8\xc3\x01\x80\x36\x98\xc2\x83\x59\x8c\x87\xae\xfe\x3d\xd3\xd8\xba\x54\x1d\xb2\x72\x39\x51\xe0\x02\x99\x6f\xdc\x52\x7f\x32\xe1\x3b\x94\xe2\xa3\xb7\xd3\xcf\xe5\xf8\x27\x2b\xdd\xed\x83\x9a\xe2\x85\xba\x48\x4a\xc1\x13\x3d\x50\x46\x2f\x53\x68\xa3\x97\x69\x95\xc2\x4b\x34\x17\xe5\xc2\x53\xe2\x80\xf4\x98\x51\x5c\xd3\x32\xef\x19\x89\x7e\xd1\x9d\xdb\xae\xa1\x33\x77\x23\x6d\x03\xad\x5e\xa5\x0f\x32\x28\x99\xa3\x00\x00\x18\xe9\x62\x97\x77\xf1\xbc\x4a\x17\xbb\xb4\x8b\x77\xd9\x5d\x78\xb8\x05\xd0\xea\xbd\xef\xd7\xec\xc2\x13\x1a\xf6\xe8\x9f\x05\xc7\x3c\x36\x5d\x62\x29\xaa\x4d\x44\xd0\x97\x22\x43\xd8\xa3\x43\xb0\x57\x9b\xe5\x1e\x1d\xc2\x87\x3e\xeb\xa7\x54\xa4\x1d\x3d\xb3\x8e\x4a\xc5\x79\x3d\x95\x4a\xbc\xab\x95\x66\x5b\x2a\xd1\xbe\x4a\xe5\x3e\x00\xdc\xbf\x60\xa2\x97\x27\x29\x58\x55\xbb\xf0\xe4\x1f\x2b\x6f\x97\x25\xbb\xf0\x34\x1b\xf1\xf0\x39\xda\xec\x39\x38\x55\x66\xed\x9e\xe7\x60\x73\x0a\x75\x74\x2f\x5a\xb9\x9c\xd5\x2b\xf7\x27\x13\x21\xa1\x91\x09\xd0\x80\x26\x94\x61\x9c\xa4\x1b\xe2\x8d\x48\xa0\xc5\xb6\x55\xb0\xa9\xf4\xc2\x13\xd4\x0b\xcf\x00\xb0\x26\x3a\x98\xc2\x07\x94\x65\x12\xf9\xdb\x85\xca\x5a\xcf\x19\x63\xa0\xc2\xee\xef\x0e\x94\x69\x62\x41\x15\x85\x3b\xd2\xe1\xdb\xdd\xd6\x29\xe3\x8d\x6c\x3e\x8b\xe7\x0f\x4c\x9b\xe6\x83\xed\x32\xb4\x91\x91\x8f\xd4\xfd\x5d\x85\x26\x92\xb7\x22\xb5\x7e\x57\x7d\x0e\xfd\x54\x94\x6c\xf8\x54\x92\x9c\x2d\x1b\x3e\x17\x25\x13\x3e\x97\x24\x6b\xcb\x9c\x4e\x61\x1b\x65\x1c\x02\xf3\x4e\x19\x10\x7f\x31\xb6\x93\x2c\xc4\x2b\x81\xd8\xc7\xeb\x76\x19\x80\x29\x6c\x25\x30\xe0\x79\xe8\x31\x77\xce\x0b\x9e\x06\x20\xb1\x0f\xc7\xdc\x70\xcc\x07\x41\xf2\x7a\x7d\x10\x8b\xd4\xce\x62\x45\x54\x75\x0c\x6b\x31\xdd\x2f\x52\xcf\xe3\x75\xdb\xe5\xa0\xbe\x57\xc3\x6f\xc0\x9b\x07\xf5\x77\x7e\x4f\xb7\x70\xcc\x87\x8d\x68\x2b\xf6\x37\x1f\x8f\x0f\x85\x0f\x76\x23\x3e\x16\xfa\xe5\x2b\x32\xa9\x11\xe5\xdb\x22\x01\xb1\x2e\x22\x8d\x59\xcb\xac\x0e\x12\x83\xe7\x23\x99\xd5\xc5\x56\xac\x8b\xf4\x10\x63\xe3\x8b\xa0\x39\xbb\x97\x38\xfe\xb3\x40\xa7\x71\x94\x05\x3c\x03\x47\x71\xd0\xe5\xdf\x33\xc7\x9f\x81\x0e\x41\x0a\x42\xae\x12\x53\x87\x04\x4c\xa7\xf0\x28\x73\x8f\xe1\x82\xfd\x30\xd2\x1d\xa6\x71\x31\xf5\x85\xc9\x61\xe6\xd2\x62\xb2\x45\x74\x60\x99\x1d\x53\x51\x81\xa9\x22\xa3\x57\xea\x43\x1b\xc9\xdb\xa5\x62\xd1\x17\x67\xdb\xa2\xea\x7d\x26\x64\x9a\x37\x00\xd5\x51\x0d\x51\xb7\xdb\x6a\x5b\xb4\x41\xad\x24\xd9\xde\xee\xf4\xc8\x6a\x0a\x2f\x13\x82\x2e\x0c\x50\xeb\xbd\x3c\x49\x45\xf8\x2c\x15\xa7\xd0\xfb\xcb\xdf\x36\x2c\xc3\xdf\x4b\x7e\x85\xf0\x3b\xa8\xd6\x2f\x58\x64\x38\x1e\x44\x63\x36\xa8\x1d\xc1\x3d\xa4\x89\xad\x49\xb6\x8c\xc2\x13\x74\xb6\x8c\xc2\xb3\x3f\x07\xd1\xaa\xc9\x1f\x31\x73\xff\xde\x8f\xef\xeb\x5e\x55\x49\xfe\x94\xca\x03\xb5\x17\x2f\x47\x61\xfc\x50\x32\x60\xaa\xd5\x54\xc2\x53\xf8\x92\xcc\xb6\x6a\xa5\xed\xa2\xb4\x55\xda\x2e\xc2\x04\x04\xaa\xf0\x81\x42\x2c\x73\x0a\xef\x53\xd8\x0a\x27\xe4\x14\x9e\xa0\x8a\x9c\xc2\x33\xb4\x51\x11\xea\xa8\x58\x4d\xf0\x91\xa8\xc1\x2d\x48\x04\x21\xe4\xab\x02\x35\x1b\xe9\xa1\xde\x13\xb0\x4f\x39\xa2\xd6\xc8\x5b\x86\x2f\x44\x82\x3c\x35\xfa\xf7\x96\x11\x88\x5e\x0f\xb6\xa7\x5d\x50\x81\xb7\x34\x70\xaa\x88\xa5\xeb\xce\xea\x28\x7a\xe4\x28\xc4\x5d\x08\x82\xa4\xdf\x88\xd1\x39\x82\xd8\x1c\x13\xab\x2f\x43\x15\xc0\x74\x5e\xd8\x55\xaa\xd0\x1f\x71\x56\xc3\xb0\x2c\x32\xd6\x2a\xd3\x8a\x83\x41\x79\xc8\xe1\x8b\x37\x58\x61\xce\xdb\xcb\xa3\x72\x84\x2e\x45\x03\xca\x50\x85\x9b\x45\x50\xd5\xd1\xe0\x77\xd1\x4e\xd2\xfd\xa8\xf0\xb4\x25\x43\x71\x54\x78\xde\x52\xc1\xf6\x00\x80\x69\x04\xa5\x31\x37\xcc\x4c\x92\x51\x9f\x7e\x22\xc9\x2c\x06\x1e\x92\x4c\xb4\xee\x52\x24\x93\x54\x63\xe6\xd0\x8c\xfa\xf4\x1f\x46\x33\xe3\x15\x26\xbd\xbd\x3c\x2e\x3b\x21\xcd\x94\x28\xcd\x8c\x33\x68\xa6\xc3\x69\xa6\xc3\x69\x66\x1c\xd0\x8c\x2f\x83\x6c\x64\x15\x9e\x26\x13\xca\x84\x42\xdd\xb7\xf0\x5c\xb3\x0a\xcf\x92\x3d\xf5\xd5\x2b\xc9\x86\xcf\x92\x3e\x9d\xc2\x47\xb4\xcc\x11\x40\xda\xb4\x16\x04\xe8\xd0\x7f\x2c\xfa\x8f\x41\xff\x91\x51\x11\xaa\x68\xfb\xdf\x69\x8f\xe0\xe4\xfb\x30\x2f\xd6\xa4\xd0\xbf\x57\x03\xcc\xbd\x97\x4f\xbb\x03\x33\xaa\x72\xb7\xab\x8d\xb6\xff\x4d\xcb\x22\x25\x1c\x46\x22\x93\xd7\x36\x11\xee\xc9\xbe\xad\xa6\x82\xaa\x99\xcb\xc9\xf9\x3c\xd3\xdf\xf5\x68\xd1\xf6\xbf\x33\x1d\xaa\xaf\xf6\x8e\x4e\xbc\x43\x9b\xc9\xc0\x7c\x24\x16\x1b\x0b\xa8\xea\xb9\x9c\x48\x90\xce\xac\x43\x41\x80\x82\x57\x87\x9a\x8c\xa2\x85\x74\xae\xd4\x0b\xa0\x66\xa1\x84\x94\x10\x18\x14\x66\x5a\xe6\x72\xa2\x85\x52\x5b\x06\x40\x39\x9f\xe7\x66\xc9\x20\x3a\x2d\x1b\x54\x07\xe1\x8c\x47\x09\x64\x8c\xc2\xa2\x71\xa2\xd5\x38\x2c\xea\xa0\xd1\x64\x62\x56\x3b\xb9\x5c\xa7\xc7\x0c\x27\x03\xd1\x3f\xf2\x22\x5b\x87\xff\xd9\xe6\x5e\x00\x9a\x05\x6a\xc2\xc3\x93\x20\x09\x02\x80\x9d\x5e\x99\x55\xcd\x23\x61\x43\xc8\xd3\xaf\x54\xfd\x72\xa4\xbe\x67\x52\xb9\x68\x3c\x99\x0c\x7c\xe5\xc5\xcd\xe5\x44\x07\xb9\x54\xed\x71\x19\xce\x44\x27\x8f\x68\x0b\x00\xe0\xa6\x31\x99\x90\xc9\xc4\x99\x4c\x2c\x9a\x8f\x0c\x46\x7a\x00\x1a\x6c\x7c\x82\xea\x6c\x08\x79\x03\xc0\x5e\x8f\x40\x0b\x3a\xd0\xe8\x17\x6e\xf4\x91\x43\xac\x8c\xc0\xd1\xcd\x4d\x3c\x05\x85\x3f\x4c\xdd\x60\x2a\x58\xe0\xe2\xc3\x9e\xc7\x4d\xa6\xc6\xc1\x73\x96\xb1\x81\x53\xde\xa6\x48\x01\x45\xa4\x0b\xa6\x20\x5e\x87\x39\x11\xf4\x1b\x71\x93\x04\x47\x56\x3d\xa7\xef\xeb\x08\x84\x22\x91\xab\x09\x37\x56\x44\x85\x26\xbd\x4a\x3f\x2f\x6c\x14\xff\x25\xf8\xba\x67\xb2\x88\xf9\xc9\x3c\x09\x1c\x9c\x26\xf8\x95\x84\x7f\x51\xd2\x21\xbd\x9d\x7e\xcd\xab\x2e\xe4\x49\xaf\xdc\x97\x82\x2f\xaa\x3c\x86\x6a\xa7\x48\x0b\x41\x5e\xf8\x97\x30\x65\x61\x80\x3f\xe3\x02\xd2\x76\xf2\xa0\x44\x1c\x12\x6d\xa2\x59\xea\x70\x42\xff\xa7\xc3\x06\xdb\x7a\x95\x44\xbc\x52\x19\xcc\xc7\x47\xb4\xc5\xa2\xaa\x02\x95\x3a\x36\x95\x52\x1f\x84\xf8\x2d\x27\xfc\x02\x1e\xb6\x87\x44\x0b\x30\xea\x69\xc6\xbf\x3b\xdb\xa5\xbd\x22\x47\x29\x1d\x56\xb2\x7c\xbb\x5c\x2c\xfe\xee\x78\x36\x5c\xa4\xd8\xcb\x62\x78\xf7\xf3\x02\x13\xe2\x77\x27\x38\x9c\xe3\xbe\xc4\xb5\x9f\xe2\x0e\x46\xa6\x41\xbe\xe8\xc6\xd0\x74\x11\x29\xd4\xcd\xc1\xf8\x9e\x18\x8e\x42\x73\xad\x5f\xc7\xac\xff\x65\xc7\xac\xff\x0b\xef\x3a\xc9\xfc\xae\x13\xbb\xf2\xf4\x0e\x40\x1b\x8d\x45\x47\xdc\xdd\x05\xfe\x59\x32\xd4\xf9\x55\xa6\x01\x2b\x28\xed\x02\x7e\xab\x69\xf7\x5d\xe4\x94\x79\xbc\xf4\x29\x33\x97\x6f\xa9\x7d\x32\xf3\x66\x14\x8f\x1f\xf9\x5b\xef\x47\x59\xe4\x86\x58\xc4\x18\x90\xc6\x88\xdc\xb3\x98\x0a\xef\x28\x6d\x60\x99\xa3\x11\x19\x7a\xd9\x36\x8b\x09\xe2\xa7\x6e\x0f\xcf\x2c\x14\xdf\x46\x06\xcf\xd1\x59\xd0\x11\x0b\x46\x0f\xf2\x46\xa6\xa6\x85\x87\x6f\xe1\xb5\xab\x48\x34\x15\xb1\x90\xec\x7f\xf3\xe8\xd5\x63\x53\x1d\x12\x0b\xc5\xcf\x68\x28\x52\x5c\xc6\x70\xbc\x11\x3f\xd8\x64\x3c\x34\xbd\x80\xb9\xba\xea\xa8\xe8\x65\x60\x8e\xa9\x6e\x67\x4b\x2f\x53\xf8\xe7\xd8\x74\x48\x9d\x3c\x38\xb7\x52\x71\xea\x9d\x43\x7a\xe8\xf7\xa7\xc8\xe7\x41\xd7\x82\x5d\x5b\x22\x05\xd3\x35\x88\xe5\x2f\x52\xb2\x7a\x70\x3f\xcc\x08\xef\x87\xf1\x29\xe3\xd1\x88\xcf\x7a\x71\xfc\x68\x0a\x51\xb9\x1c\x8e\x78\x68\xd8\xb5\xaa\x33\xcb\xbc\xd7\x6d\x52\x50\x47\x23\x6a\x86\xe8\x5c\x36\x25\xee\x0b\x00\xd1\x49\xde\x00\x00\x33\xf4\x04\x3f\xe2\x1f\x7b\xc7\x97\x2c\xa8\x3f\x8a\xe9\xe8\x80\x44\x1c\x44\xcc\x17\x9c\x5b\x62\x64\xea\x1d\xb9\x9c\xc0\x8f\xdd\xc2\x8b\x4c\xb8\x60\x5b\x83\xda\x6f\x63\x6b\x24\x0a\xbf\xe5\xd9\x57\xfe\x37\x01\xfc\x26\x09\x86\x69\x10\x61\x0a\x0a\x9c\x27\x46\xc1\x15\xa7\x40\xf2\x27\x4b\x47\x34\x7a\x24\xa2\x20\xe4\xb1\x77\xb6\x9a\xf7\x07\x9c\x17\x44\x9a\xcb\xee\x25\x70\x05\x0a\x0a\x20\x2f\x00\x01\x4c\x41\xc6\x28\xfd\x63\xbe\x4f\x25\xc6\xb2\x13\x91\x7c\x4c\x7f\x4b\xe1\x0e\xe1\x10\xf2\x14\xc0\xd8\x26\x3b\xb8\x3c\x39\x66\x95\x3c\x42\xf0\x82\x10\xe7\xe2\xd0\xb6\x06\xc9\x91\xf1\x0d\x4c\x72\xb9\x05\xc0\xfd\x5b\x26\x94\x26\x43\xd2\x08\xf3\x78\xac\xba\xc9\x36\xa0\x72\x71\xc1\xf7\x60\x10\x0e\xef\xcb\x66\x46\xd1\x9b\x25\x00\xaa\x4e\xc1\x22\x0f\x23\x75\x40\x94\x5b\x7d\x34\x14\x2d\x88\xc1\x74\xd6\x72\x84\xc1\xb6\x7c\x3a\x4d\xd3\x70\x16\x51\xb5\x47\x14\x51\xaa\xe5\x02\x9d\xea\x96\xfe\xb0\x2e\x6e\x09\x71\xec\xa4\x96\x1a\x09\x0c\xbe\xb5\xc8\x4d\xed\x86\x30\xf5\x89\x7d\xcc\x21\x3f\x76\x6b\x50\xa4\x4a\xef\xac\x2a\x5d\x16\x0b\xcf\xc0\x64\x4e\xd5\x73\x3a\xf6\xa7\x40\x72\x45\x42\x31\x92\x45\x48\x41\x7f\x69\xcf\x62\x22\x96\x8f\x2a\xf2\x04\x4c\x61\xaf\x3f\x6f\x54\x31\x14\xcd\x52\xea\x39\x0e\x70\x81\xda\xc7\xaa\x63\xb3\x03\xe0\x34\x31\xc5\xee\xa3\x8d\xcc\xeb\xb9\xd8\xa0\x8c\xd4\xeb\x3b\x61\x22\x70\x11\xce\x8e\x24\xf5\x11\x39\x27\x94\x92\xab\x56\x81\x4a\x27\xcb\xb4\x90\x03\xe9\xdf\x23\x53\x1d\x26\xaf\xab\x61\x64\xd1\x0d\x30\x1e\x39\x55\x76\x87\x0b\xd2\x4f\x75\x88\x6d\xca\x88\xbb\xe7\xc7\x2c\xaa\x3b\x35\xa4\x28\xd6\x6e\x4c\xc3\x69\xaa\x03\x52\xb0\x89\x13\x08\x79\xc1\xb6\x06\x02\xf4\xb9\x08\x61\x1c\x04\x40\xe1\xff\xa6\x95\xb7\x6e\xd4\x01\xd9\x78\xa1\x9c\x20\x68\x3b\xb0\xed\x4b\xf2\xe4\x50\xe3\x82\x76\x97\xee\x31\x98\x23\x2e\x0c\x2c\xa2\x3a\xfe\x36\x13\x05\x46\x96\x02\xa8\xf2\x3b\xa8\x9e\x18\x41\x8e\xc7\x06\xbe\x1b\x02\x55\x73\x13\x22\xa0\xa0\x3e\x3c\x10\x63\xe8\x6d\xa4\xe8\xe5\xa5\x18\x70\x26\xde\x97\x94\x05\xa1\x18\xcd\x60\x0c\x8a\x6a\x3c\xaa\xb6\x2f\x7f\x02\x5e\x10\x17\x53\x89\x79\xe9\xf7\x9a\x00\x98\x9e\xeb\xab\x43\x94\x7e\x10\x2e\x38\xa6\xbf\x36\x00\x3a\xa1\x86\x5a\x9c\x4e\xa9\x0a\x9e\xe2\x49\x4d\x4b\xbd\x27\xb1\xae\x19\x12\xa3\xbc\x05\x1a\xa8\xcd\xee\x80\xda\xc4\xc1\x8e\x63\xe9\xd7\x63\x87\x88\xc2\x50\x75\xd4\xad\x5b\xe7\x7e\x54\x1e\xb0\xf1\x6f\xe9\x54\x28\x1b\xea\x68\x4b\xbf\xa1\x40\xb7\xee\xc8\xb3\x00\x0d\x6e\xa2\xb1\x8b\x4b\xb2\x27\xe2\xf8\xa5\x24\x11\xc3\x22\x2c\xb2\xb3\x7e\xcf\x4d\xa6\x23\xd5\xbf\x09\xeb\x4f\x2a\x83\x03\x0f\xd4\xc1\x2d\xe9\x19\x7d\x74\x24\xe2\x98\xbe\x31\x7b\x67\x90\x40\x07\x11\x31\x7c\x51\xed\x67\x63\x20\x85\x97\x89\xd9\x37\x54\x47\x23\xd3\xbd\x54\x75\xc3\x89\x16\x05\x99\x30\x21\x5f\x24\xe1\xff\xba\x61\xff\x09\x90\x4f\x9f\x79\xf7\x21\xbb\x9e\x76\xa9\xdf\x13\x73\x1c\x85\x13\xcd\x86\x54\x59\xd2\x0d\x2d\x52\xec\xe5\xc0\x07\xcb\x7c\x7a\x8e\xe4\xb3\x6f\x68\x91\x7b\xf3\x91\x5d\x19\x60\x71\xbb\x91\xf2\x44\x09\xb4\x07\xea\x88\x44\xca\xd9\x37\xbc\x31\x2d\xa2\x6b\x06\xd7\xb7\xcf\x19\x22\xe2\xdd\x67\x57\x80\x63\x9b\x28\xa7\xe7\x17\x91\x8a\x5e\x0e\xe4\x51\xf0\x2c\xce\x6c\xe0\x6b\x6e\x90\x5f\x82\xb6\xa1\x77\xa9\x59\x87\xde\x51\x8f\xa7\xce\x7d\x61\xc5\x49\xaa\xf6\x1a\x7f\xd6\x89\x5b\xd0\x0d\x83\x58\xac\x9a\xd7\xe4\x80\x43\x5a\xd8\x86\xd7\x83\x5c\x87\xfd\x3a\xb7\xfe\x83\xaa\x91\xaf\xa7\x37\x37\x36\xf1\xeb\x5f\x2d\xac\x7f\xc5\xeb\x4f\x21\xf1\xf4\x5c\x1e\x87\x2f\x1a\x19\x8c\x88\xcc\xe7\xc6\x4e\x78\xb4\x33\x9c\xbb\xb1\xe5\x0c\x86\xec\xef\x09\x26\x82\xe4\x80\x7b\x1b\x50\x66\x5b\x9f\xc4\xb6\xbe\x15\x51\x25\x72\xb9\xe8\x57\x5c\x4f\xc8\xd6\x31\x66\x23\x44\x23\x8e\x62\xde\x3f\x8c\x1d\x32\x64\xd5\x45\x0c\x82\xbb\xe3\x00\x5a\x99\x4c\x86\x55\x8c\x28\x3e\x36\xd5\x12\x82\x3f\x28\x77\x3f\x1f\xd3\x8e\x5f\xb8\x5b\xb1\xd7\xe7\xbe\xb2\xc2\x80\x4b\xd0\x78\x2d\xc8\xae\xbe\x26\x05\xb5\x03\x5e\xa2\xbc\x30\x97\x73\x7c\xa1\x51\xc3\xf9\xe0\x6f\x09\x7b\x0c\xd1\x8a\xb0\x06\x6f\x4d\x47\xa6\x26\x0a\x5d\x83\x99\xce\x8e\xb9\xa1\x0e\x06\xc4\xb6\x37\xbc\x86\x1b\x0f\x9e\xe8\x12\xa0\x53\x30\xd4\x7b\x02\x20\x9e\x4e\x21\xd5\x31\xc7\x49\x76\xe9\xf3\xae\x71\x4c\xe2\x8c\xe0\x78\x1a\xaa\x12\xd1\xfa\xa1\x70\xf1\x73\x67\xcb\x14\x5c\x30\xcc\x21\xa1\x16\x20\x42\x88\x2d\xe6\x65\xe3\xeb\xe5\x8f\xf6\x69\xbd\x51\x4b\x10\x54\xf0\x4c\x03\x6f\xc3\x82\x3f\xbc\x0b\x58\x69\x29\xc6\xaf\x51\xcd\x59\x77\x68\xa1\xd8\xb2\x3a\x05\xba\xb0\x1e\x88\x9a\x93\x45\x16\x9c\x21\x1a\xab\xb6\x83\x82\x74\x4d\x28\x47\xf2\x02\xf5\xa0\xfc\x0a\x08\xea\x8d\x43\x2c\x3f\xd2\x2f\xdb\xf0\x45\x08\xe7\x72\x64\x26\x64\xff\x0a\x1f\x5b\x94\xe1\x79\xca\x6c\x06\x30\xa3\xad\x6c\x0e\x9f\x83\xf6\xb7\x22\x01\x41\xc0\x1d\x93\x7f\x23\x2e\xff\x14\x6e\xbe\x9e\x13\x9b\x38\x40\xb4\x66\x98\xb9\xec\x85\x16\xda\xc6\x33\x99\xce\xa2\x15\xa8\xf0\x34\x66\x36\xd4\x11\x2e\xdc\xe8\x96\xed\xb0\x2d\x5e\xd5\xab\x3a\xd2\x99\x93\xeb\x42\xbf\x1e\xe9\x86\x06\xf4\x14\x19\x35\x8e\x1b\x27\x8d\x36\xa7\xa4\x5c\x4e\x14\x2e\x94\xf3\xd6\xd9\x25\x35\x27\x79\xdd\xb6\x7a\x4f\x26\x13\xbd\x70\xab\xda\x73\x55\x00\xcd\x60\x2b\x37\x99\x08\x81\x0b\x22\x7c\x04\x23\x76\x8f\x9b\xd5\xf4\xdd\x0d\x9e\xad\x95\x5d\x28\xea\x00\x4c\x26\x29\x35\x4a\x60\x0f\x02\x24\x87\x48\x62\xca\x5b\xc2\xf4\xd7\x81\x7f\xaa\x31\x17\xb3\xf2\x2c\xcc\x52\x75\x8e\xaf\xa3\xf9\xe0\xad\xa2\x0d\x44\x75\xe6\x42\xcc\x26\xdc\x79\xa4\xe7\xdf\xe6\x35\x3c\xac\x24\xbc\x0f\xa2\xc2\xbc\xbb\x06\xb4\xe1\x10\x00\x28\xcf\xad\x25\xc3\x01\x6c\x02\x00\x37\xad\xc9\x64\x33\x81\xc2\xc9\x64\xbe\x3a\x38\x99\x64\x09\x07\x0b\x12\x00\x33\x7b\x24\x00\x16\x99\xff\x81\x0b\xd6\x4b\xf3\x21\x97\x8b\x66\x1c\x93\x1b\xc7\x5b\xc7\xa4\xbb\x89\x3b\x5c\x7b\x04\x46\xeb\xc2\x08\xa4\x3e\x80\x38\x58\x65\xcf\xcd\xae\xe0\xf6\x67\x7c\x21\x48\xa9\x69\x69\xdc\x83\x1a\x39\x14\xa6\x5c\x12\x9f\x37\xb0\x17\x63\x73\xd1\x38\x6e\x28\x97\x82\x44\xb8\x87\x17\x61\x9e\x4e\x53\x57\xf9\x62\x57\xe6\x42\x6b\x50\xc4\x81\x38\xaa\xc5\x8c\xe0\x40\x94\x49\xbd\x3e\x98\x7d\x48\x44\x6d\x5b\xbe\xf9\x94\x8b\x0b\xda\xa0\xd0\x3c\x6d\x5f\xfe\x68\x62\xa5\xf1\xe3\xbc\x7b\xdc\x48\x9e\xf3\xe0\xa8\x87\x76\x8e\xaf\xc8\xbf\xee\xae\x85\xb6\x16\x0f\xfa\x63\x06\x17\x00\xfe\x0d\xbf\x62\xd5\xf8\xe8\x44\xe3\xb8\xf5\x1b\x31\x78\x30\xa2\x67\xf4\xc3\xc7\x22\x7a\x46\xbe\xd4\xcf\xe5\x04\x6e\xa6\x7a\xe5\xf9\x92\x5f\xc3\x57\x66\x48\x52\x8b\x51\x99\x0e\x43\x2d\x73\x0e\xd0\x73\x36\x41\x52\xb8\x36\x87\xcf\xb9\x1c\x4f\x63\x7b\x55\xf6\x2d\x85\x17\xdb\x1a\x48\xbc\x31\xe4\xfd\x4a\x5e\xa7\x1e\x94\xa9\x1f\xbc\xad\xfa\xce\xba\x17\xcf\x8c\x96\xac\xd9\x48\xdf\xfe\xb7\x6b\xde\xdc\xf8\x4f\x58\xf8\x96\x37\xd5\x5a\x7c\x3b\x53\xf2\xf0\x37\x9d\xce\x5f\x3b\xaf\x33\x0f\x81\x53\x90\xbe\x00\xc8\x57\x2a\x90\xc8\xfa\xfd\x03\x47\x0c\x7b\x0f\xc9\xc3\x15\xdd\x6f\xbe\xa8\x15\xa9\x26\x61\xcd\xd4\x09\xaf\x29\xd1\x52\x0b\x8c\x21\x94\x30\x3c\x19\x33\x6b\x07\x26\xaf\xa7\x88\xc6\xf4\x10\x0c\x9d\xc2\x2d\x51\x87\xfc\x25\x22\x75\x98\xb0\x75\xa1\xe3\x2d\x90\x93\x5e\x20\x03\x40\x83\x2b\x63\x35\x57\xf4\xfe\x82\x0e\x25\xf5\x29\xd4\x12\x08\xa0\xca\x18\x3f\x43\xf3\x82\xca\x90\x1f\xcb\xe5\x47\x95\x21\x3f\xa4\xab\x1a\xb9\x53\xaf\xf0\x9b\xa4\xa2\x50\x1e\x32\x84\x90\x54\x66\xd5\x61\x37\x38\x1d\x46\xf1\x94\xcb\x8a\x4c\x05\x08\x3f\x8b\xb0\x08\x53\x31\x99\xcc\xd2\x94\xac\xc8\x23\x48\xdc\xf8\x9c\x86\x06\xf2\x74\x0a\x95\xcc\x48\x2c\x6a\xc2\x33\x7d\x92\x63\x30\x97\xe3\xae\xce\x4d\x84\xa2\x79\x5b\xf7\xe6\x5f\x5b\xea\xc8\xd9\xf2\xb2\x92\xe5\x61\x9b\xa1\x6e\x3f\x8c\xd4\xe7\x70\xeb\xcc\xb5\xf3\x23\xd2\x95\x0b\x18\xc2\x4b\x04\x5f\x18\xa5\x18\xb4\xc3\xf5\xf1\x50\xf3\xb0\x66\x5e\xde\x1d\x20\xab\x67\x07\xe7\xc5\x83\xe8\xeb\x11\xa3\xc2\xd9\x45\xa3\x5b\x3f\xfd\xa1\x9c\xb6\x2f\xa9\x66\xd0\xba\x6c\x9c\xf0\x77\x1f\x5a\x27\x78\xbf\x21\xf1\x73\xfe\x05\xa3\xe7\xc6\xcc\x98\xd9\x27\x73\xf8\x96\xc0\x3c\x41\xf9\x01\x67\xc3\xcc\xe5\xdb\x2b\x86\x4c\x63\x1c\xbf\x2d\x8c\x84\x92\x00\xe5\x18\x69\x8e\x63\x0f\x55\xcc\x19\x3b\x15\x04\x52\xbc\x6d\xf6\x14\x02\xf5\xd9\x1b\x14\x08\xcf\xa3\xe4\x02\x3b\x69\xa1\x92\x08\x35\xd8\x81\xf7\x0d\x73\xc7\x7a\x79\x79\x64\x20\x84\x86\x35\x5a\xd0\x90\x78\x31\xcf\x21\x05\xdd\xb0\x89\xe5\xc8\x4c\xbf\x15\x65\x48\x22\x6a\x1a\x90\x48\x82\x1d\x42\x79\x3a\x85\x43\x14\xe8\xc3\xb0\x89\x7c\xcd\x16\x36\x90\xf0\xe3\xc7\x8f\x08\x71\xfc\xf8\xf1\x23\x46\x1f\x3f\xfc\x46\x37\x0b\x6b\x7a\x20\x6f\x63\x27\xe2\xec\x9a\x51\x41\xc8\x37\xf2\xc3\xfc\x6f\x2f\xdf\x8d\x8d\x8d\x8d\x0d\x8f\x9a\xa5\x0d\x41\xd8\xd8\xd4\xef\x1f\x4c\xcb\x51\x0d\xa7\xca\x0b\x3d\xb2\x96\x36\x28\xa5\xc7\x8b\xa7\xbc\x06\xfb\xaf\xf0\x5b\xfe\x26\xdf\x7c\x3b\xc8\xdf\x52\x17\x2a\x96\x74\x9c\xf9\xdc\xd1\xf1\x7c\x07\x97\x27\xc7\x88\xea\x1d\x31\xb5\x31\x11\xc2\xee\x9b\x5f\x96\x88\xe1\x0e\xb5\x94\x08\x25\x4b\x03\x91\x5e\xa9\x0f\x65\x44\x7a\xe5\x7e\xd5\x89\x68\x2e\xc8\x80\x4e\xa8\xbb\x20\x39\x16\x5e\x1e\x8f\x2e\x1f\x10\x7d\x24\xd6\x55\x87\x14\x0c\xd3\x15\x41\xbe\x44\xde\xf3\xe3\x7d\x4b\x35\x86\xe6\xbd\x08\x40\xc1\x31\x2f\xf8\xe5\xa7\xd2\x3b\x16\x58\xbe\xfd\x6f\xaa\x77\x4b\x94\x27\x7e\xdf\x16\x0b\x79\x50\x15\xa9\x80\x78\x57\x01\x35\x28\x16\x7e\x67\xf7\x3a\x93\xc1\xc1\x11\xe3\x38\x79\x14\x83\x7d\x2e\xc5\xcf\xf9\x03\x67\x68\xfa\x60\x8c\xf3\x4a\x27\x62\x3b\x33\x07\x55\x8d\xdd\x7b\x38\xa3\x7f\x02\x7e\x26\x02\x49\x86\x2f\x2e\x1e\x63\xd1\x0a\x1f\x4e\xa8\x09\x7c\xf8\x3c\xac\xa4\xdc\xaf\x71\xef\x4f\x41\x75\xcc\x6b\x71\x48\x06\xe6\x90\x74\xcf\x5b\xd4\xc8\x33\x0d\xba\x84\xa4\xb7\xd3\x07\x40\x9a\x55\x12\x39\x6b\x62\xf1\x03\xf3\x9c\x34\x97\x49\x5f\x07\x9c\xe5\xa6\x9c\x31\x21\x07\xcd\x42\x5f\xd5\x29\x98\x0f\xc4\x10\xa9\x48\x75\x2d\xdd\x21\xd4\x1c\xe4\xfe\xd5\x7b\x11\x27\xc1\x85\xde\x9d\x24\xda\xa7\x01\xa2\x9c\x02\x8b\xe3\x12\x01\xb4\xa6\x60\x9a\x31\xcf\x64\xe4\x75\x64\x88\x09\xb6\xcc\x1c\xb4\x42\x0c\xb2\xcf\xd1\xa2\x12\x67\x2b\x78\x2c\x40\x80\xde\x6b\x90\x85\x47\xdd\xd6\xaf\xf5\x11\xe3\xc3\xb7\xfa\x70\x48\x8c\xb0\xcc\x7f\x0b\x09\x09\x37\xfa\x13\x19\x86\x05\x23\xba\x29\x84\xad\x52\xb1\x58\x2c\x3e\x3c\x85\xf9\x8e\xf9\x80\x84\x58\x0e\x7f\xbb\x07\x09\x45\x9a\xc5\x35\x07\x4f\x83\x08\xf7\x01\x80\xfe\x25\x96\xe0\x22\x49\xbc\x90\x6f\x3d\xdd\xd0\x90\x60\x98\x0c\xf6\x02\xcf\x35\x37\x5b\xa1\xe0\x58\x63\x22\xf0\x27\x84\x86\xcf\x35\x11\xa7\x95\x20\x07\xc0\xe4\x06\x72\x40\x6a\x2d\x04\x01\xc4\x03\xbb\xa3\x57\x07\x23\xd4\x42\x59\x49\x48\x31\xf3\x3c\x87\x4c\x15\x21\xbe\x57\x10\xfb\x7f\x38\x05\xd3\xb0\x88\x3a\x7c\xb6\x1d\xd5\x21\x83\x5b\xd5\xd0\x48\xf2\x10\x87\x20\x9b\x38\x2d\x6a\xac\x3e\xaa\xa3\x28\xc9\x79\x3a\x5e\xea\x0d\xd1\x4f\xc5\x5c\x4e\x18\x98\x54\x69\x75\x08\x7f\x44\x8e\xf5\x71\x41\xfb\xc8\xe5\xc4\xc1\x88\xa8\x56\x00\x90\x00\x68\xb1\x57\x4d\xe1\x2e\x55\xa8\xc0\x14\x3e\x22\x31\x1e\x3a\x94\x56\xab\xa0\xec\xdf\x1d\xa5\xb3\xed\x88\x3c\x73\xb3\x44\x75\x17\x1b\xe1\x99\x3e\x5b\x33\xa3\xcc\xf3\xcf\x56\xc3\x3d\x9d\xe6\x3f\x81\xdb\xd5\x48\x2c\x80\x8e\xe4\x60\x01\xe0\x00\xdd\x8b\x46\x7a\x6b\xaa\x69\x7b\xd5\x7f\xfe\xe6\x01\x40\x39\xe0\xf4\x22\x27\x74\xc8\xe8\x1a\xc0\xcd\x6d\x51\x3f\x53\x87\x13\xfd\xec\xd6\x34\xc8\x44\x3f\x33\x87\x60\x5b\xe3\xe6\x87\xa1\x3e\xea\x9a\xea\x98\x56\x61\x6c\x13\x0b\x6b\x94\xbf\x4e\x26\x3e\xa8\x2b\xca\x09\x29\x90\x5c\xce\xcf\xfa\xca\xb2\x58\x0c\xec\x44\xd4\x53\x27\x56\xe1\x76\xda\x62\x49\x5e\xa0\x9b\x6a\x56\x3d\xb6\x1d\xb7\x78\x3a\xbf\x66\xb8\xa3\x55\xef\x16\x99\x00\x3c\x85\x3d\xb9\x0d\x7a\x06\x54\x67\xb8\xcb\xa0\x9a\x38\xc4\x61\x57\x3c\xad\x82\x69\xb0\xfa\xfe\xca\xcd\x6a\x1e\xf5\x52\xc8\x51\x4f\xc9\x64\xb2\x4c\x93\x38\xc5\xac\xdc\x3c\xea\x6e\xcc\xf0\x6a\xd9\xb5\x24\x22\x66\xf2\x76\x5b\xd4\xd3\xc2\x28\xe4\xfc\x53\x20\x39\x59\x8c\x24\x60\xd3\xba\x2f\x51\x74\x4f\xa2\x3c\x8a\x51\x61\xcd\xb4\xf7\xbc\xf0\x91\x72\xb6\x4f\x1f\xb7\x59\x22\x80\x54\x4c\xe0\x66\x0c\x1f\x93\x09\x61\x2e\x9a\x19\x1b\x2e\x97\x73\x32\x8b\xbd\x3d\x37\x99\xc4\x8b\xc2\x9d\x00\x1d\x30\x15\x9d\x84\x70\xb5\xa1\x49\x07\x1f\x3b\x80\xd0\x0b\xea\xd0\x7c\xe0\xba\xb6\x9a\xd2\x39\xd2\x84\x49\xb3\x7c\x39\x38\xa0\xdc\x26\x2b\x88\xbc\x1a\x86\xb0\x88\x24\x8f\x84\x8f\x9b\xf5\x53\x85\x1a\x00\x1b\x02\xc4\xcc\x81\xcf\x0b\xb0\xef\xcc\x2f\xf8\x87\x97\x17\xe3\x6b\x36\x6d\x5e\x1a\xcf\xa5\xf5\x1e\xc6\xd7\x23\x7d\xd0\x1a\xf2\x1a\xbf\xb1\x20\x18\x3f\x2f\xff\x9b\xf0\x1b\x7b\xe5\xf4\xd9\x76\xc8\x7d\xbc\x8e\x9f\xc7\xeb\xd0\x31\xd1\xb5\x21\xf1\x09\xac\x27\x68\xf3\xdc\xdb\x6a\xec\x95\xcc\x58\x94\xe6\xff\xde\x20\xc0\x52\x91\x3d\x9e\x69\x21\x79\xfe\xd3\xe6\x36\x8f\x14\x0c\xa3\xff\xcc\x9f\xf5\x60\x8c\x3e\x2f\x2e\x10\xbc\x98\xf1\xb8\x3d\x3f\xa4\xce\x0b\xd7\xfb\xc1\x55\xe4\x20\xe0\x8e\x3d\xcf\xc7\x03\xdd\x34\xe2\xf0\xd7\xfa\x44\xab\x30\x32\x07\xdc\xe3\xc4\x42\x64\xbc\x80\x3e\x75\x70\x4b\xd0\xcb\x34\x16\xb8\xe7\x45\xea\xfd\x60\x4f\x42\xa1\x62\x46\x08\x1c\xd5\x36\x96\x79\xc1\xd6\x0f\x78\xb8\x55\x6d\x9f\x0e\x5b\x86\x42\xfb\x4c\x46\xfc\x6a\x91\x8c\x70\x64\x3d\xdc\x47\xc3\xc4\xc1\x7e\xec\xf8\x7c\x32\x29\x02\xc8\x00\x6c\x2a\x22\x06\x94\x87\x7b\xeb\x57\xb8\xe8\x9e\x9d\x9d\x9e\x5f\xfe\xb8\xf8\xbc\xff\xa3\x7e\x8e\xbf\xb4\xda\xfb\x7c\xe5\xd8\x5b\x0c\x51\x80\xe1\xb9\xfe\x64\xe2\x32\x28\xdc\xa3\x6d\x5f\xa8\xf7\xc4\x43\x5f\x62\x74\xea\xd0\x7f\xca\x18\x62\x7e\x8f\xe6\x46\xdc\xcc\x6c\x45\xbb\x4c\x05\xce\xc5\xba\x67\x66\x53\xf6\xdc\xd9\x83\x9f\xbe\x2d\xb5\x64\x78\xc3\x90\x85\x41\xcd\x42\xd6\xd4\x47\x57\x0a\x0b\xde\x71\x7e\x2e\x97\x46\x21\xcd\xff\xc1\x1c\x3d\x17\x73\xb0\x40\xf5\xbd\x44\x28\xd9\x32\x34\xe2\xdf\xc8\x10\x31\xa8\x2d\x5c\x6b\x69\x36\x39\xd5\x62\xa8\x93\xb2\x16\x63\x32\xf1\x57\x62\x73\xf6\x4a\x70\x38\x4f\xb7\x96\xff\x56\xb5\xf4\xf3\xd7\x24\x40\x9b\xdf\xed\x72\x38\x8b\x0f\x6c\x46\x8c\x81\xf7\xa4\xb5\xc1\xca\xbf\x9e\x1c\x1f\x38\xce\xc3\x39\xf9\x73\x4c\x6c\x87\x3d\x18\xb2\xc0\x66\xd0\x6f\xc4\x0a\x42\xc8\x88\x28\xfd\x40\xbf\x11\xcb\xc5\xe2\x26\xcd\xa5\xad\xc6\x36\xb0\x44\xa1\xa9\xea\x23\x32\xdc\x70\x4c\x1e\xcd\xb6\xc1\x66\xb9\x21\x50\x69\x17\x79\xd6\xa5\xbc\xfb\x0e\xe4\x85\x0d\x57\x77\x6e\x37\x78\xdb\x0d\x6a\xb8\x6f\x08\xf9\x00\x16\xbb\x13\xe7\xcd\x36\x11\xa5\x46\x28\xc9\x35\x1e\x89\xe1\x1c\xeb\xb6\x43\x0c\x62\x89\x8c\x17\x09\x30\x15\xaa\x46\xfc\x50\x35\xf6\x9e\x28\xdd\xa3\x30\xab\x35\x8b\x9a\x10\x60\xc6\x9a\x59\x91\x76\xf1\x30\x37\x8a\x0b\xfb\xc1\x34\x6c\x76\xf3\x3a\xfc\x62\x47\xa8\xc2\xf5\xc8\xbc\x16\x66\xac\x76\xc4\xcd\x9b\x51\x5a\x35\x0a\x0e\xff\x0b\xc9\x90\xae\x8b\xff\x95\x56\x0f\x2d\xa6\x0b\x4e\x0d\xae\x03\x0a\xfb\x8d\x4b\x81\x6f\x41\x68\x14\x6c\x62\x0c\xe7\x86\x06\x2e\xe4\x10\x31\xba\x0a\x68\x93\x22\x9a\x07\xa7\xcd\xa6\x4e\xcf\xec\x8e\xc8\x8f\x7c\x1e\x64\x90\x2b\xe9\xa7\x2c\x06\xcc\x24\xb4\xd7\x57\x7a\x87\x67\xf5\xe9\xc1\x0d\xae\x20\x66\x8f\xdb\xe7\x52\xb3\x9e\x15\xf6\x7e\xe6\x82\xee\x2b\xbe\x51\x96\x8d\xa6\x4c\xd8\xad\xac\x13\xba\xa5\xd4\xd9\xe1\x3a\x86\xa8\x82\x29\xc4\xb9\xdc\x26\xb5\xdc\xd4\xc2\xc0\x32\x6d\x9b\xf3\x27\x24\xa8\x86\x69\x3c\xdf\x9b\x63\x5b\x00\x50\x0d\x22\x7a\x64\xa8\xf2\x88\x1e\xc8\x78\xb6\x5a\xf0\x6d\xf1\x5c\xce\x26\x8e\xb7\x70\x51\x0b\x82\xf7\xb1\x5b\x2c\x02\x68\xcd\xa1\x42\x66\x72\x65\x51\x61\x36\xd4\xe0\x77\x52\x98\x37\xc3\x66\xb6\x7d\x36\x1f\xea\x8a\x04\xe4\x72\x9b\x8a\x48\x40\x2d\x2d\x4b\x64\x7c\xd1\x78\x57\xf1\x25\xb2\xe8\xdb\xe6\xec\xbd\x7c\x4a\xbf\x38\x14\x21\x11\xe6\x3d\x67\xf5\x13\x7a\x0e\x06\x81\x60\x63\x19\x01\xb8\xa0\xca\x7c\xde\x5a\xf8\x31\xd2\x8d\xbb\xc9\x44\x0c\x3f\x50\x54\xcb\x2a\xcc\x3a\x68\x53\x05\x10\x7a\x31\xf9\xd9\x9c\x1f\x8f\x8c\x78\x02\x3d\xd5\x74\x60\x8e\xf2\xa4\x70\x6b\xda\x0e\xb5\x37\xf2\xd4\xae\xb6\x9c\xc8\x23\xb9\xea\xf0\x39\x35\x46\x9f\xad\x31\x3d\x90\x20\x4f\x53\xbe\x23\xcf\xb6\x18\x62\x9f\x39\xa3\x67\x85\x5b\xe3\x60\xeb\xcd\x8c\x8d\xe6\x17\xc7\x22\x36\x66\x34\x78\xd9\x99\x1f\x6b\x3c\xf0\x42\xaa\xb3\x1e\xbe\xd5\xbd\x38\x8b\xa4\x35\x32\x53\xe7\x4d\x69\xbc\x3f\xe8\x4c\x03\x7d\xd7\x77\x1f\xd8\xc8\xc9\x50\x4e\x35\xb2\xe0\x97\x73\x38\x34\xfe\xe2\xe9\xe9\x8d\x88\xfd\xe9\x6e\x95\xf8\x4b\x62\xe3\xd1\x48\x4a\x74\xd4\x23\xfd\x30\x0c\x60\xe4\x3b\xdd\xd9\xb6\xf9\xbe\x6d\x3f\x6a\xdf\xf3\x4f\xf7\x23\xef\xe1\xc6\x68\x51\xe1\xf7\x2a\x77\x67\x43\xfe\x54\x63\xa2\x90\xbd\xd6\x98\x81\x50\xef\xed\x34\x9c\x38\x4c\x0e\xca\xc7\x61\xb9\x96\x51\xce\x65\x10\x0f\xb6\x60\xb2\x57\x2c\xc2\x0a\x88\x1f\x69\x06\x75\xed\x47\x2d\x56\x75\x6b\x07\xc4\xef\x31\x4e\x26\xa3\xb0\xbb\x61\xf6\xe3\xb6\xcb\xe8\x1e\x9c\x3f\x1a\xf3\x62\x19\x0d\x30\x65\x82\x8f\x73\x3e\x8b\x0a\x33\x6b\x80\x30\xe7\x7c\xc6\x42\xce\xc7\x01\x30\xce\x37\xb3\x4e\x4c\x80\x42\x02\xd6\x7f\x0b\x15\x12\x3f\xb2\x8b\x1f\xb2\x93\xcc\xd0\x22\x44\xa2\x71\x43\x88\xa4\xa3\xc1\x10\x29\x5c\x9e\x1e\x35\xda\xfc\x39\x4a\x32\xf3\x18\xf3\xd7\xd5\xcb\xff\xb2\xab\x97\x8e\x58\xaa\x70\x47\xc4\x1e\x80\xea\xbc\x95\x7d\x61\x27\xd4\x45\xc8\x0f\xd9\x4b\x53\x68\xc7\x89\xe2\xe5\xe2\xf2\xbc\xd5\xde\x97\x8a\x10\x5f\x5e\x9e\xb7\xe4\xee\x65\x43\x2a\xc1\xee\xf9\xb1\x54\x86\xca\x69\xb7\x7d\xd9\x38\x97\x76\xfc\xbf\x2e\xa4\x0a\x3c\x3d\x6b\xb4\x3b\xdd\xd3\xcb\x86\xb4\x0b\x95\xe3\xd3\x8b\x06\xff\x78\x37\x85\x66\xf0\x32\x66\x8c\x06\xd3\x97\x11\xf1\x64\xb2\x89\x0b\x83\x48\xa5\xc9\x84\x07\x34\x30\x2e\x12\x2d\x00\xfe\x95\x9b\x6a\xe8\x4d\x62\x21\x47\xf1\x6a\xde\x23\x45\xdb\xdf\xed\xdf\xe1\x77\xfb\xf7\x6d\xf6\x22\x91\x1f\xa6\xa0\xa2\x62\x55\xfd\x28\x57\x55\xdf\xf1\x64\x23\xa3\xa7\xf6\xc3\x36\xf9\x6d\x00\x4d\x64\x89\x36\x2c\x03\xa8\x23\xb3\x57\xec\xc3\x01\x32\xd9\x0b\xfe\x9c\x7e\x74\xe0\x3d\x51\x40\xfc\x6e\xed\x9e\xde\xaf\x8e\x26\x13\x31\x91\x87\x7a\x7d\x00\x47\xbc\x15\xc3\x45\xcb\x70\xc4\xc1\x64\x52\x84\xa5\x22\x00\x21\x65\xc0\xf8\xe6\x8d\x23\x29\x9c\x2b\x0e\x7f\x68\xaa\x58\xb5\x3e\x3a\x55\x2b\x9f\x07\x91\x0e\x71\xcf\xea\xf7\x29\x24\x91\xb2\xa2\x6c\x36\x91\x64\x4d\xec\x82\xff\x64\xb2\x49\xfc\xa3\x8b\x08\xf6\xa3\x79\xa9\x10\x94\x44\x79\xd8\xc6\x0f\x41\x89\xe8\x00\x9e\x22\x6c\x8a\x41\x8b\xd8\x9a\xe8\x74\x15\xc7\x48\x10\x60\x27\xc4\x5f\xcb\x18\x58\x4c\x15\xa2\x5c\xa4\x13\x09\x72\xe9\xf0\x75\x73\x51\x27\xbe\x68\x5d\x64\x89\x2e\x5d\x34\x0d\x75\xe9\xa2\x29\xa8\xdb\x2b\xf5\xe1\x90\x45\xca\x78\x18\xd2\xfa\xd5\x61\x2e\x27\x0e\x7b\xc3\xe0\x19\xcf\x7e\x1e\x05\x4f\xdc\x29\xb5\x92\x14\xac\x93\xc2\x17\xc9\x47\x7f\x13\x15\xab\xcd\x8f\x72\xb5\xe9\x13\x4e\x03\x19\xbd\x66\x10\xdf\xd2\x88\xff\x3a\x8a\xb7\x91\xc6\x79\xd4\xe0\xdc\x66\x32\x11\x84\xf8\xef\x9d\x84\x5b\x2c\x15\x29\x19\xc4\x71\x7a\x8d\x73\x39\x71\x9c\xe7\x41\x4c\xe1\x49\xa3\x57\x06\xd8\x43\x1c\x71\xd0\xfe\x5e\xa5\xc3\xbc\x89\xce\xbf\xc1\x5c\xd2\xb4\x45\xbf\x7a\xc3\xa1\x8e\xc4\xde\x4d\xef\x26\x44\x47\x1f\x0a\x02\x6c\xf8\x01\x6c\xd9\x80\x2f\x18\xe4\xdb\x59\x90\x6f\x7d\xc8\xb7\xb0\x51\xd0\x46\x63\x32\x13\x5e\xc8\x3f\xc6\x79\x44\x55\xbe\xcd\x22\x74\x0a\xe1\xb5\x5b\x10\xfb\xca\xe7\x13\xa3\x09\x39\x4e\xb4\xda\xd6\x16\xf4\xa1\x95\xe2\xd0\xe2\xcd\x29\x5f\x1b\xe7\x72\xa2\xee\x3d\xd6\x4a\x17\x50\x52\x59\x14\x8f\xa7\xef\x8d\xa7\x80\xd1\x25\x80\x89\x3a\x8c\x81\x7a\x95\x22\x0b\x3c\x0d\x5d\xca\xe3\x5c\x6e\x3e\x5c\x7d\x9a\x14\xec\x29\xde\x48\x72\x39\x6a\x01\x81\xe0\xfd\x0c\x9c\xe0\x7c\x56\xc8\x12\x3c\x39\xb9\x59\x82\x2a\xfd\xc7\xa4\xbb\x69\x40\xff\x19\xf1\xcd\x55\xac\x8e\x3f\x5a\xd5\xb1\x4f\xbc\x1d\xf6\x83\x0f\xaa\x85\x1d\x71\x1c\xbc\x39\xd1\xf1\x62\x5f\x7f\xe3\x91\xac\xbf\x09\xbf\x49\x72\xcd\xcc\xa3\x8e\x24\x1a\x68\xd3\x80\xea\x64\x62\x50\x4b\x26\x3a\x2f\x9f\xd4\xbd\x99\x99\x53\xc0\xfa\x8e\x3f\x9b\xf4\xfd\xbb\x20\xc9\x35\x91\x82\x62\x63\x04\x92\x8c\x36\x8b\xd1\x1a\xa2\x20\x19\x5e\x57\x2a\x95\xb9\x03\x64\xf2\x39\xd0\xe1\xc7\x60\x01\xf6\xe8\x92\x01\x68\xe5\xe0\xb9\x23\x35\x78\x03\xd1\xcc\xe5\x46\xfe\xaf\x29\xc0\x81\x37\x21\xd5\x71\x2c\x41\x1a\x45\x4e\xa0\x13\x73\x08\xf6\xa2\x37\x8d\x51\xaf\xd8\x9f\xc6\x1f\x0b\xe3\x84\xce\x3a\x0f\x01\xf9\xac\xc8\x87\xe3\xed\x0f\x48\xf7\x02\x07\x52\x1d\x45\x6f\x12\xbb\xde\x3e\x40\xa3\x5e\xa9\x4f\x89\x9b\x8d\xc2\x8d\xbd\xa1\xe5\x6f\xa9\xcc\xae\xba\xc9\xae\x2e\x66\xf6\xd5\x65\x5b\xcf\xeb\x29\x28\x29\xb3\x92\x60\x14\xe5\x70\x14\xdd\xd8\x28\xc6\xd6\x68\x2e\xc6\xba\xe7\xc7\x31\x5c\x4d\x03\xb2\x8b\x42\x81\xc1\xb2\xaa\xb9\x9c\x18\x2e\x0c\x23\x91\x28\x7a\x37\xbc\xe0\xe9\xef\x4e\xd0\xc2\xa4\x5b\x53\x74\x60\xa2\xba\x7f\x9e\x42\xeb\x4c\x29\x65\x51\x91\x90\xcb\x89\x8c\xae\xfc\xdd\x67\xe6\x72\x5e\x53\x76\x16\xd7\xc3\x7d\xe4\x00\xe8\xd0\x6d\x97\xfd\x74\xa6\x1f\xf6\x6d\x3e\x10\x63\x8b\x71\x0c\x41\xc2\xf1\x19\x07\xbc\x6a\x9a\x7e\x45\x6e\x46\x93\x90\x41\x31\xb3\x60\x30\xe3\x8d\x5e\xcc\x79\x94\x5d\xf3\xff\x88\x09\x36\xa9\x27\xfc\xf6\x5d\xf8\x4d\x80\x3c\xa1\xfa\x4e\xf9\xf7\x30\x9e\xe3\x53\x10\x82\xc9\xde\x13\xf2\x3f\xb6\xca\x00\x92\xc9\x24\x9f\x37\xa0\xd5\x33\xfa\xfe\xb1\xa8\xb8\xfd\xef\x9e\xf0\x5b\x7f\x42\xff\xf9\x9f\x6d\x0d\x32\xab\x65\x94\x1a\x57\xf8\x34\x37\x0e\x15\x27\x41\xf0\x82\x3c\x2d\x16\xe4\x69\x53\xaa\x10\xd5\x3c\x62\xac\x0f\x40\x35\xcf\xdf\x66\xe6\x7e\x0c\x4f\x99\xb9\x24\x4f\x0e\x10\x71\xcf\xee\x47\x82\x9f\x8e\x75\xdb\x61\x01\xa5\x54\x03\x06\x22\x55\x1f\x86\x64\xa0\xdf\xab\x23\x01\xc0\xc8\x25\x27\x95\xda\xc8\x53\x50\xfd\xff\x02\x00\x00\xff\xff\xe0\xd4\xad\xc2\xfa\x88\x02\x00"), - }, - "/plot.html.tpl": &vfsgen۰CompressedFileInfo{ - name: "plot.html.tpl", - modTime: time.Date(2018, 8, 13, 15, 32, 56, 947476959, time.UTC), - uncompressedSize: 958, - - compressedContent: []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\x74\x53\x5b\x6b\xdb\x4c\x10\x7d\xfe\xfc\x2b\xe6\xdb\x12\x2c\x83\x2d\xb9\x79\x28\xc5\x96\x0c\x6d\x12\x7a\x21\xbd\xd0\xa4\x4f\x6d\x03\xe3\xdd\x91\xb4\x44\xde\x15\xab\x91\x53\x63\xfc\xdf\xcb\xee\xfa\x96\x42\x5f\xa4\xe1\xcc\x9c\x33\x67\x8f\x56\xf9\xff\xca\x4a\xde\xb4\x04\x35\xaf\x9a\xc5\x20\x3f\xbc\x08\xd5\x62\x00\x90\xb3\xe6\x86\x16\xdb\x6d\x7a\xef\x8b\xdd\x2e\xcf\x22\xe2\x7b\x2b\x62\x04\x59\xa3\xeb\x88\x0b\xd1\x73\x39\x79\x2d\x42\xa3\xe3\x4d\x24\x5d\x6f\x2a\x87\x6d\xdd\x5d\xdd\xdd\x79\x6a\xc4\x07\x79\x16\xe5\xf3\xa5\x55\x9b\x40\x50\x7a\x0d\x5a\x15\xa2\x41\x26\x23\x35\x75\x02\xc2\x6c\x21\x4a\x6b\x78\x52\xe2\x4a\x37\x9b\x19\x5c\xd9\xde\x69\x72\x73\x78\xd2\x8a\xeb\x19\xbc\x9c\x4e\x2f\x2e\xe6\x50\x93\xae\x6a\x9e\xc1\xab\xe9\xb4\xfd\x2d\x16\x79\xa6\xf4\x3a\xc8\x2e\x7b\x66\x6b\x82\xb2\xb2\x4f\xa6\xb1\xa8\xc4\xe2\x7a\x5f\x01\x76\xf0\xf5\xf3\xbb\x3c\x8b\x53\x8b\xc1\x7f\x79\x27\x9d\x6e\xd9\x1b\x7f\x7f\xff\xe9\xf6\xf2\x0a\xcd\x1a\xbb\x8f\xd1\x7a\x6c\x3d\x1b\x3a\x9c\xee\xf9\x84\x3f\xff\xb1\x54\x56\xf6\x2b\x32\x9c\x56\xc4\x37\x0d\xf9\xf2\xed\xe6\x83\x4a\x4e\x7e\x46\x29\x2a\x75\xb3\x26\xc3\xb7\xba\x63\x32\xe4\x12\x21\x1b\x2d\x1f\xc5\x18\xca\xde\x48\xd6\xd6\x24\x34\x82\xed\x00\x00\xc2\x57\xba\x94\xc1\x57\x72\xd4\xf6\x31\x8e\x61\xbb\x44\xf9\x58\x39\xdb\x1b\x35\x03\xf1\xa2\x2c\x4b\xb1\x1b\xa5\x5c\x93\x49\x8e\x3a\x91\x79\x10\x03\x58\xa3\x83\xde\x35\x50\x40\xec\xa4\x6c\xaf\x91\xf1\xfb\xb7\xdb\x64\xa8\x57\x58\x51\xd6\x9a\x6a\x38\x4a\x1d\xb5\x0d\x4a\x4a\xb2\x07\x85\x8c\xb3\xd0\xfa\x99\xfd\x78\x98\xff\xca\xc6\x30\x0c\x18\xb6\x6d\xa3\x25\xfa\x35\x99\x95\x4c\x3c\xe9\xd8\x11\xae\x86\xa3\xf9\xd9\x32\x84\xe2\x94\x89\x74\x84\x4c\xfb\x58\x12\x81\xe2\x38\x8a\x69\x47\xfc\x86\xd9\xe9\x65\xcf\x74\x96\xd6\x18\xc4\x9a\x2a\x62\x9c\xb4\x8d\xe5\xb4\x35\xd5\xbf\x49\xb5\xa3\x52\x8c\xfd\xf9\xce\x46\x42\xb4\xc9\x1e\xd8\x85\xb7\x7f\x0e\xa2\x3d\x69\x0d\xa3\x36\xe4\xce\x6d\xfe\xfd\xe9\x4e\x97\x34\xd0\x3d\xcf\xb6\xdc\x41\x01\xdb\x6d\xfa\xa5\xe5\x6e\xb7\x3b\xe0\x3e\x99\x88\xfb\x58\x4f\xb8\x37\x0f\x05\x18\x7a\x82\xfd\x25\x4a\x8e\xab\xc7\x81\x35\x0e\x9a\x61\xc1\xe9\x6a\xe5\x59\xfc\x63\xf2\x2c\xfe\xa6\x7f\x02\x00\x00\xff\xff\x1b\x44\x5a\x92\xbe\x03\x00\x00"), - }, - } - fs["/"].(*vfsgen۰DirInfo).entries = []os.FileInfo{ - fs["/VERSIONS"].(os.FileInfo), - fs["/dygraph.css"].(os.FileInfo), - fs["/dygraph.min.js"].(os.FileInfo), - fs["/html2canvas.min.js"].(os.FileInfo), - fs["/plot.html.tpl"].(os.FileInfo), - } - - return fs -}() - -type vfsgen۰FS map[string]interface{} - -func (fs vfsgen۰FS) Open(path string) (http.File, error) { - path = pathpkg.Clean("/" + path) - f, ok := fs[path] - if !ok { - return nil, &os.PathError{Op: "open", Path: path, Err: os.ErrNotExist} - } - - switch f := f.(type) { - case *vfsgen۰CompressedFileInfo: - gr, err := gzip.NewReader(bytes.NewReader(f.compressedContent)) - if err != nil { - // This should never happen because we generate the gzip bytes such that they are always valid. - panic("unexpected error reading own gzip compressed bytes: " + err.Error()) - } - return &vfsgen۰CompressedFile{ - vfsgen۰CompressedFileInfo: f, - gr: gr, - }, nil - case *vfsgen۰FileInfo: - return &vfsgen۰File{ - vfsgen۰FileInfo: f, - Reader: bytes.NewReader(f.content), - }, nil - case *vfsgen۰DirInfo: - return &vfsgen۰Dir{ - vfsgen۰DirInfo: f, - }, nil - default: - // This should never happen because we generate only the above types. - panic(fmt.Sprintf("unexpected type %T", f)) - } -} - -// vfsgen۰CompressedFileInfo is a static definition of a gzip compressed file. -type vfsgen۰CompressedFileInfo struct { - name string - modTime time.Time - compressedContent []byte - uncompressedSize int64 -} - -func (f *vfsgen۰CompressedFileInfo) Readdir(count int) ([]os.FileInfo, error) { - return nil, fmt.Errorf("cannot Readdir from file %s", f.name) -} -func (f *vfsgen۰CompressedFileInfo) Stat() (os.FileInfo, error) { return f, nil } - -func (f *vfsgen۰CompressedFileInfo) GzipBytes() []byte { - return f.compressedContent -} - -func (f *vfsgen۰CompressedFileInfo) Name() string { return f.name } -func (f *vfsgen۰CompressedFileInfo) Size() int64 { return f.uncompressedSize } -func (f *vfsgen۰CompressedFileInfo) Mode() os.FileMode { return 0444 } -func (f *vfsgen۰CompressedFileInfo) ModTime() time.Time { return f.modTime } -func (f *vfsgen۰CompressedFileInfo) IsDir() bool { return false } -func (f *vfsgen۰CompressedFileInfo) Sys() interface{} { return nil } - -// vfsgen۰CompressedFile is an opened compressedFile instance. -type vfsgen۰CompressedFile struct { - *vfsgen۰CompressedFileInfo - gr *gzip.Reader - grPos int64 // Actual gr uncompressed position. - seekPos int64 // Seek uncompressed position. -} - -func (f *vfsgen۰CompressedFile) Read(p []byte) (n int, err error) { - if f.grPos > f.seekPos { - // Rewind to beginning. - err = f.gr.Reset(bytes.NewReader(f.compressedContent)) - if err != nil { - return 0, err - } - f.grPos = 0 - } - if f.grPos < f.seekPos { - // Fast-forward. - _, err = io.CopyN(ioutil.Discard, f.gr, f.seekPos-f.grPos) - if err != nil { - return 0, err - } - f.grPos = f.seekPos - } - n, err = f.gr.Read(p) - f.grPos += int64(n) - f.seekPos = f.grPos - return n, err -} -func (f *vfsgen۰CompressedFile) Seek(offset int64, whence int) (int64, error) { - switch whence { - case io.SeekStart: - f.seekPos = 0 + offset - case io.SeekCurrent: - f.seekPos += offset - case io.SeekEnd: - f.seekPos = f.uncompressedSize + offset - default: - panic(fmt.Errorf("invalid whence value: %v", whence)) - } - return f.seekPos, nil -} -func (f *vfsgen۰CompressedFile) Close() error { - return f.gr.Close() -} - -// vfsgen۰FileInfo is a static definition of an uncompressed file (because it's not worth gzip compressing). -type vfsgen۰FileInfo struct { - name string - modTime time.Time - content []byte -} - -func (f *vfsgen۰FileInfo) Readdir(count int) ([]os.FileInfo, error) { - return nil, fmt.Errorf("cannot Readdir from file %s", f.name) -} -func (f *vfsgen۰FileInfo) Stat() (os.FileInfo, error) { return f, nil } - -func (f *vfsgen۰FileInfo) NotWorthGzipCompressing() {} - -func (f *vfsgen۰FileInfo) Name() string { return f.name } -func (f *vfsgen۰FileInfo) Size() int64 { return int64(len(f.content)) } -func (f *vfsgen۰FileInfo) Mode() os.FileMode { return 0444 } -func (f *vfsgen۰FileInfo) ModTime() time.Time { return f.modTime } -func (f *vfsgen۰FileInfo) IsDir() bool { return false } -func (f *vfsgen۰FileInfo) Sys() interface{} { return nil } - -// vfsgen۰File is an opened file instance. -type vfsgen۰File struct { - *vfsgen۰FileInfo - *bytes.Reader -} - -func (f *vfsgen۰File) Close() error { - return nil -} - -// vfsgen۰DirInfo is a static definition of a directory. -type vfsgen۰DirInfo struct { - name string - modTime time.Time - entries []os.FileInfo -} - -func (d *vfsgen۰DirInfo) Read([]byte) (int, error) { - return 0, fmt.Errorf("cannot Read from directory %s", d.name) -} -func (d *vfsgen۰DirInfo) Close() error { return nil } -func (d *vfsgen۰DirInfo) Stat() (os.FileInfo, error) { return d, nil } - -func (d *vfsgen۰DirInfo) Name() string { return d.name } -func (d *vfsgen۰DirInfo) Size() int64 { return 0 } -func (d *vfsgen۰DirInfo) Mode() os.FileMode { return 0755 | os.ModeDir } -func (d *vfsgen۰DirInfo) ModTime() time.Time { return d.modTime } -func (d *vfsgen۰DirInfo) IsDir() bool { return true } -func (d *vfsgen۰DirInfo) Sys() interface{} { return nil } - -// vfsgen۰Dir is an opened dir instance. -type vfsgen۰Dir struct { - *vfsgen۰DirInfo - pos int // Position within entries for Seek and Readdir. -} - -func (d *vfsgen۰Dir) Seek(offset int64, whence int) (int64, error) { - if offset == 0 && whence == io.SeekStart { - d.pos = 0 - return 0, nil - } - return 0, fmt.Errorf("unsupported Seek in directory %s", d.name) -} - -func (d *vfsgen۰Dir) Readdir(count int) ([]os.FileInfo, error) { - if d.pos >= len(d.entries) && count > 0 { - return nil, io.EOF - } - if count <= 0 || count > len(d.entries)-d.pos { - count = len(d.entries) - d.pos - } - e := d.entries[d.pos : d.pos+count] - d.pos += count - return e, nil -} diff --git a/vendor/github.com/tsenart/vegeta/lib/plot/plot.go b/vendor/github.com/tsenart/vegeta/lib/plot/plot.go deleted file mode 100644 index 749bab4e..00000000 --- a/vendor/github.com/tsenart/vegeta/lib/plot/plot.go +++ /dev/null @@ -1,400 +0,0 @@ -//go:generate go run -tags=dev assets_gen.go - -package plot - -import ( - "encoding/json" - "fmt" - "html/template" - "io" - "io/ioutil" - "math" - "sort" - "strconv" - "strings" - "time" - - vegeta "github.com/tsenart/vegeta/lib" - "github.com/tsenart/vegeta/lib/lttb" -) - -// An Plot represents an interactive HTML time series -// plot of Result latencies over time. -type Plot struct { - title string - threshold int - series map[string]*labeledSeries - label Labeler -} - -// An Labeler is a function that returns a label -// to partition and represent Results in separate (but overlaid) line charts -// in the rendered plot. -type Labeler func(*vegeta.Result) (label string) - -// ErrorLabeler is an HTMLPlotLabeler which -// labels a result with an OK or ERROR label -// based on whether it has an error set. -func ErrorLabeler(r *vegeta.Result) (label string) { - switch r.Error { - case "": - return "OK" - default: - return "ERROR" - } -} - -// labeledSeries groups timeSeries by a label function applied to -// each incoming result. It re-orders and buffers out-of-order results -// by their sequence number before adding them to the labeled timeSeries. -type labeledSeries struct { - began time.Time - seq uint64 - buf map[uint64]point - series map[string]*timeSeries - label Labeler -} - -// a point to be added to a timeSeries. -type point struct { - ts *timeSeries - seq uint64 - t time.Time - v float64 -} - -func newLabeledSeries(label Labeler) *labeledSeries { - return &labeledSeries{ - buf: map[uint64]point{}, - series: map[string]*timeSeries{}, - label: label, - } -} - -func (ls *labeledSeries) add(r *vegeta.Result) (err error) { - label := ls.label(r) - - ts, ok := ls.series[label] - if !ok { - ts = newTimeSeries(r.Attack, label) - ls.series[label] = ts - } - - p := point{ - ts: ts, - seq: r.Seq, - t: r.Timestamp, - v: r.Latency.Seconds() * 1000, - } - - if ls.buf[p.seq] = p; p.seq != ls.seq { - return nil // buffer - } else if ls.seq == 0 { - ls.began = r.Timestamp // first point in attack - } - - for len(ls.buf) > 0 { - p, ok := ls.buf[ls.seq] - if !ok { - break - } - delete(ls.buf, ls.seq) - - // timestamp in ms precision - err = p.ts.add(uint64(p.t.Sub(ls.began))/1e6, p.v) - if err != nil { - return fmt.Errorf("point with sequence number %d in %v", p.seq, err) - } - - ls.seq++ - } - - return nil -} - -// Opt is a functional option type for Plot. -type Opt func(*Plot) - -// Title returns an Opt that sets the title of a Plot. -func Title(title string) Opt { - return func(p *Plot) { p.title = title } -} - -// Downsample returns an Opt that enables downsampling -// to the given threshold number of data points per labeled series. -func Downsample(threshold int) Opt { - return func(p *Plot) { p.threshold = threshold } -} - -// Label returns an Opt that sets the given Labeler -// to be used to partition results into multiple overlaid line charts. -func Label(l Labeler) Opt { - return func(p *Plot) { p.label = l } -} - -// New returns a Plot with the given Opts applied. -// If no Label opt is given, ErrorLabeler will be used as default. -func New(opts ...Opt) *Plot { - p := &Plot{series: map[string]*labeledSeries{}} - for _, opt := range opts { - opt(p) - } - - if p.label == nil { - p.label = ErrorLabeler - } - - return p -} - -// Add adds the given Result to the Plot time series. -func (p *Plot) Add(r *vegeta.Result) error { - s, ok := p.series[r.Attack] - if !ok { - s = newLabeledSeries(p.label) - p.series[r.Attack] = s - } - return s.add(r) -} - -// Close closes the HTML plot for writing. -func (p *Plot) Close() { - for _, as := range p.series { - for _, ts := range as.series { - ts.data.Finish() - } - } -} - -// WriteTo writes the HTML plot to the give io.Writer. -func (p Plot) WriteTo(w io.Writer) (n int64, err error) { - type dygraphsOpts struct { - Title string `json:"title"` - Labels []string `json:"labels,omitempty"` - YLabel string `json:"ylabel"` - XLabel string `json:"xlabel"` - Colors []string `json:"colors,omitempty"` - Legend string `json:"legend"` - ShowRoller bool `json:"showRoller"` - LogScale bool `json:"logScale"` - StrokeWidth float64 `json:"strokeWidth"` - } - - type plotData struct { - Title string - DygraphsCSS template.CSS - HTML2CanvasJS template.JS - DygraphsJS template.JS - Data template.JS - Opts template.JS - } - - dp, labels, err := p.data() - if err != nil { - return 0, err - } - - var sz int - if len(dp) > 0 { - sz = len(dp) * len(dp[0]) * 12 // heuristic - } - - data := dp.Append(make([]byte, 0, sz)) - - opts := dygraphsOpts{ - Title: p.title, - Labels: labels, - YLabel: "Latency (ms)", - XLabel: "Seconds elapsed", - Legend: "always", - ShowRoller: true, - LogScale: true, - StrokeWidth: 1.3, - Colors: labelColors(labels[1:]), - } - - optsJSON, err := json.MarshalIndent(&opts, " ", " ") - if err != nil { - return 0, err - } - - assets := map[string][]byte{} - for _, path := range []string{"dygraph.min.js", "dygraph.css", "html2canvas.min.js"} { - bs, err := asset(path) - if err != nil { - return 0, err - } - assets[path] = bs - } - - cw := countingWriter{w: w} - err = plotTemplate.Execute(&cw, &plotData{ - Title: p.title, - DygraphsCSS: template.CSS(assets["dygraph.css"]), - HTML2CanvasJS: template.JS(assets["html2canvas.min.js"]), - DygraphsJS: template.JS(assets["dygraph.min.js"]), - Data: template.JS(data), - Opts: template.JS(optsJSON), - }) - - return cw.n, err -} - -var ( - reds = []string{ - "#EE7860", - "#DD624E", - "#CA4E3E", - "#B63A30", - "#9F2823", - "#881618", - "#6F050E", - } - greens = []string{ - "#A6DA83", - "#84C068", - "#64A550", - "#488A3A", - "#2F7027", - "#185717", - "#053E0A", - } -) - -func labelColors(labels []string) []string { - colors := make([]string, 0, len(labels)) - - var red, green int - for _, label := range labels { - var color string - if strings.Contains(label, "ERROR") { - color = reds[red%len(reds)] - red++ - } else { - color = greens[green%len(greens)] - green++ - } - colors = append(colors, color) - } - - return colors -} - -// See http://dygraphs.com/data.html -func (p *Plot) data() (dataPoints, []string, error) { - var ( - series []*timeSeries - count int - ) - - for _, as := range p.series { - for _, s := range as.series { - if s != nil { - series = append(series, s) - count += s.len - } - } - } - - var ( - size = 1 + len(series) - nan = math.NaN() - labels = make([]string, size) - data = make(dataPoints, 0, count) - ) - - labels[0] = "Seconds" - - sort.Slice(series, func(i, j int) bool { - return series[i].attack+series[i].label < - series[j].attack+series[j].label - }) - - for i, s := range series { - points, err := lttb.Downsample(s.len, p.threshold, s.iter()) - if err != nil { - return nil, nil, err - } - - for _, p := range points { - pt := make([]float64, size) - for j := range pt { - pt[j] = nan - } - pt[0], pt[i+1] = p.X, p.Y - data = append(data, pt) - } - - labels[i+1] = s.attack + ": " + s.label - } - - sort.Sort(data) - - return data, labels, nil -} - -func asset(path string) ([]byte, error) { - file, err := Assets.Open(path) - if err != nil { - return nil, err - } - return ioutil.ReadAll(file) -} - -type countingWriter struct { - n int64 - w io.Writer -} - -func (cw *countingWriter) Write(p []byte) (int, error) { - n, err := cw.w.Write(p) - cw.n += int64(n) - return n, err -} - -type dataPoints [][]float64 - -func (ps dataPoints) Len() int { return len(ps) } - -func (ps dataPoints) Less(i, j int) bool { - // Sort by X axis (seconds elapsed) - return ps[i][0] < ps[j][0] -} - -func (ps dataPoints) Swap(i, j int) { - ps[i], ps[j] = ps[j], ps[i] -} - -func (ps dataPoints) Append(buf []byte) []byte { - buf = append(buf, "[\n "...) - - for i, p := range ps { - buf = append(buf, " ["...) - - for j, f := range p { - if math.IsNaN(f) { - buf = append(buf, "NaN"...) - } else { - buf = strconv.AppendFloat(buf, f, 'f', -1, 64) - } - - if j < len(p)-1 { - buf = append(buf, ',') - } - } - - if buf = append(buf, "]"...); i < len(ps)-1 { - buf = append(buf, ",\n "...) - } - } - - return append(buf, " ]"...) -} - -var plotTemplate = func() *template.Template { - bs, err := asset("plot.html.tpl") - if err != nil { - panic(err) - } - return template.Must(template.New("plot").Parse(string(bs))) -}() diff --git a/vendor/github.com/tsenart/vegeta/lib/plot/timeseries.go b/vendor/github.com/tsenart/vegeta/lib/plot/timeseries.go deleted file mode 100644 index 19e662e7..00000000 --- a/vendor/github.com/tsenart/vegeta/lib/plot/timeseries.go +++ /dev/null @@ -1,56 +0,0 @@ -package plot - -import ( - "errors" - "time" - - tsz "github.com/tsenart/go-tsz" - "github.com/tsenart/vegeta/lib/lttb" -) - -// An in-memory timeSeries of points with high compression of -// both timestamps and values. It's not safe for concurrent use. -type timeSeries struct { - attack string - label string - prev uint64 - data *tsz.Series - len int -} - -func newTimeSeries(attack, label string) *timeSeries { - return &timeSeries{ - attack: attack, - label: label, - data: tsz.New(0), - } -} - -var errMonotonicTimestamp = errors.New("timeseries: non monotonically increasing timestamp") - -func (ts *timeSeries) add(t uint64, v float64) error { - if ts.prev > t { - return errMonotonicTimestamp - } - - ts.data.Push(t, v) - ts.prev = t - ts.len++ - - return nil -} - -func (ts *timeSeries) iter() lttb.Iter { - it := ts.data.Iter() - return func(count int) ([]lttb.Point, error) { - ps := make([]lttb.Point, 0, count) - for i := 0; i < count && it.Next(); i++ { - t, v := it.Values() - ps = append(ps, lttb.Point{ - X: time.Duration(t * 1e6).Seconds(), - Y: v, - }) - } - return ps, it.Err() - } -} diff --git a/vendor/github.com/tsenart/vegeta/lib/reporters.go b/vendor/github.com/tsenart/vegeta/lib/reporters.go deleted file mode 100644 index e86a8fbd..00000000 --- a/vendor/github.com/tsenart/vegeta/lib/reporters.go +++ /dev/null @@ -1,252 +0,0 @@ -package vegeta - -import ( - "encoding/json" - "fmt" - "io" - "sort" - "strings" - "text/tabwriter" - "time" -) - -// A Report represents the state a Reporter uses to write out its reports. -type Report interface { - // Add adds a given *Result to a Report. - Add(*Result) -} - -// Closer wraps the optional Report Close method. -type Closer interface { - // Close permantently closes a Report, running any necessary book keeping. - Close() -} - -// A Reporter function writes out reports to the given io.Writer or returns an -// error in case of failure. -type Reporter func(io.Writer) error - -// Report is a convenience method wrapping the Reporter function type. -func (rep Reporter) Report(w io.Writer) error { return rep(w) } - -// NewHistogramReporter returns a Reporter that writes out a Histogram as -// aligned, formatted text. -func NewHistogramReporter(h *Histogram) Reporter { - return func(w io.Writer) (err error) { - tw := tabwriter.NewWriter(w, 0, 8, 2, ' ', tabwriter.StripEscape) - if _, err = fmt.Fprintf(tw, "Bucket\t\t#\t%%\tHistogram\n"); err != nil { - return err - } - - for i, count := range h.Counts { - ratio := float64(count) / float64(h.Total) - lo, hi := h.Buckets.Nth(i) - pad := strings.Repeat("#", int(ratio*75)) - _, err = fmt.Fprintf(tw, "[%s,\t%s]\t%d\t%.2f%%\t%s\n", lo, hi, count, ratio*100, pad) - if err != nil { - return nil - } - } - - return tw.Flush() - } -} - -// NewTextReporter returns a Reporter that writes out Metrics as aligned, -// formatted text. -func NewTextReporter(m *Metrics) Reporter { - const fmtstr = "Requests\t[total, rate, throughput]\t%d, %.2f, %.2f\n" + - "Duration\t[total, attack, wait]\t%s, %s, %s\n" + - "Latencies\t[mean, 50, 95, 99, max]\t%s, %s, %s, %s, %s\n" + - "Bytes In\t[total, mean]\t%d, %.2f\n" + - "Bytes Out\t[total, mean]\t%d, %.2f\n" + - "Success\t[ratio]\t%.2f%%\n" + - "Status Codes\t[code:count]\t" - - return func(w io.Writer) (err error) { - tw := tabwriter.NewWriter(w, 0, 8, 2, ' ', tabwriter.StripEscape) - if _, err = fmt.Fprintf(tw, fmtstr, - m.Requests, m.Rate, m.Throughput, - m.Duration+m.Wait, m.Duration, m.Wait, - m.Latencies.Mean, m.Latencies.P50, m.Latencies.P95, m.Latencies.P99, m.Latencies.Max, - m.BytesIn.Total, m.BytesIn.Mean, - m.BytesOut.Total, m.BytesOut.Mean, - m.Success*100, - ); err != nil { - return err - } - - codes := make([]string, 0, len(m.StatusCodes)) - for code := range m.StatusCodes { - codes = append(codes, code) - } - - sort.Strings(codes) - - for _, code := range codes { - count := m.StatusCodes[code] - if _, err = fmt.Fprintf(tw, "%s:%d ", code, count); err != nil { - return err - } - } - - if _, err = fmt.Fprintln(tw, "\nError Set:"); err != nil { - return err - } - - for _, e := range m.Errors { - if _, err = fmt.Fprintln(tw, e); err != nil { - return err - } - } - - return tw.Flush() - } -} - -// NewJSONReporter returns a Reporter that writes out Metrics as JSON. -func NewJSONReporter(m *Metrics) Reporter { - return func(w io.Writer) error { - return json.NewEncoder(w).Encode(m) - } -} - -var logarithmic = []float64{ - 0.00, - 0.100, - 0.200, - 0.300, - 0.400, - 0.500, - 0.550, - 0.600, - 0.650, - 0.700, - 0.750, - 0.775, - 0.800, - 0.825, - 0.850, - 0.875, - 0.8875, - 0.900, - 0.9125, - 0.925, - 0.9375, - 0.94375, - 0.950, - 0.95625, - 0.9625, - 0.96875, - 0.971875, - 0.975, - 0.978125, - 0.98125, - 0.984375, - 0.985938, - 0.9875, - 0.989062, - 0.990625, - 0.992188, - 0.992969, - 0.99375, - 0.994531, - 0.995313, - 0.996094, - 0.996484, - 0.996875, - 0.997266, - 0.997656, - 0.998047, - 0.998242, - 0.998437, - 0.998633, - 0.998828, - 0.999023, - 0.999121, - 0.999219, - 0.999316, - 0.999414, - 0.999512, - 0.999561, - 0.999609, - 0.999658, - 0.999707, - 0.999756, - 0.99978, - 0.999805, - 0.999829, - 0.999854, - 0.999878, - 0.99989, - 0.999902, - 0.999915, - 0.999927, - 0.999939, - 0.999945, - 0.999951, - 0.999957, - 0.999963, - 0.999969, - 0.999973, - 0.999976, - 0.999979, - 0.999982, - 0.999985, - 0.999986, - 0.999988, - 0.999989, - 0.999991, - 0.999992, - 0.999993, - 0.999994, - 0.999995, - 0.999996, - 0.999997, - 0.999998, - 0.999999, - 1.0, -} - -// NewHDRHistogramPlotReporter returns a Reporter that writes out latency metrics -// in a format plottable by http://hdrhistogram.github.io/HdrHistogram/plotFiles.html. -func NewHDRHistogramPlotReporter(m *Metrics) Reporter { - return func(w io.Writer) error { - tw := tabwriter.NewWriter(w, 0, 8, 2, ' ', tabwriter.StripEscape) - _, err := fmt.Fprintf(tw, "Value(ms)\tPercentile\tTotalCount\t1/(1-Percentile)\n") - if err != nil { - return err - } - - total := float64(m.Requests) - for _, q := range logarithmic { - value := milliseconds(m.Latencies.Quantile(q)) - oneBy := oneByQuantile(q) - count := int64((q * total) + 0.5) // Count at quantile - _, err = fmt.Fprintf(tw, "%f\t%f\t%d\t%f\n", value, q, count, oneBy) - if err != nil { - return err - } - } - - return tw.Flush() - } -} - -// milliseconds converts the given duration to a number of -// fractional milliseconds. Splitting the integer and fraction -// ourselves guarantees that converting the returned float64 to an -// integer rounds the same way that a pure integer conversion would have, -// even in cases where, say, float64(d.Nanoseconds())/1e9 would have rounded -// differently. -func milliseconds(d time.Duration) float64 { - msec, nsec := d/time.Millisecond, d%time.Millisecond - return float64(msec) + float64(nsec)/1e6 -} - -func oneByQuantile(q float64) float64 { - if q < 1.0 { - return 1 / (1 - q) - } - return float64(10000000) -} diff --git a/vendor/github.com/tsenart/vegeta/lib/results.go b/vendor/github.com/tsenart/vegeta/lib/results.go deleted file mode 100644 index 2754cb51..00000000 --- a/vendor/github.com/tsenart/vegeta/lib/results.go +++ /dev/null @@ -1,241 +0,0 @@ -package vegeta - -import ( - "bufio" - "bytes" - "encoding/base64" - "encoding/csv" - "encoding/gob" - "io" - "sort" - "strconv" - "time" - - "github.com/mailru/easyjson/jlexer" - jwriter "github.com/mailru/easyjson/jwriter" -) - -func init() { - gob.Register(&Result{}) -} - -// Result contains the results of a single Target hit. -type Result struct { - Attack string `json:"attack"` - Seq uint64 `json:"seq"` - Code uint16 `json:"code"` - Timestamp time.Time `json:"timestamp"` - Latency time.Duration `json:"latency"` - BytesOut uint64 `json:"bytes_out"` - BytesIn uint64 `json:"bytes_in"` - Error string `json:"error"` - Body []byte `json:"body"` -} - -// End returns the time at which a Result ended. -func (r *Result) End() time.Time { return r.Timestamp.Add(r.Latency) } - -// Equal returns true if the given Result is equal to the receiver. -func (r Result) Equal(other Result) bool { - return r.Attack == other.Attack && - r.Seq == other.Seq && - r.Code == other.Code && - r.Timestamp.Equal(other.Timestamp) && - r.Latency == other.Latency && - r.BytesIn == other.BytesIn && - r.BytesOut == other.BytesOut && - r.Error == other.Error && - bytes.Equal(r.Body, other.Body) -} - -// Results is a slice of Result type elements. -type Results []Result - -// Add implements the Add method of the Report interface by appending the given -// Result to the slice. -func (rs *Results) Add(r *Result) { *rs = append(*rs, *r) } - -// Close implements the Close method of the Report interface by sorting the -// Results. -func (rs *Results) Close() { sort.Sort(rs) } - -// The following methods implement sort.Interface -func (rs Results) Len() int { return len(rs) } -func (rs Results) Less(i, j int) bool { return rs[i].Timestamp.Before(rs[j].Timestamp) } -func (rs Results) Swap(i, j int) { rs[i], rs[j] = rs[j], rs[i] } - -// A Decoder decodes a Result and returns an error in case of failure. -type Decoder func(*Result) error - -// A DecoderFactory constructs a new Decoder from a given io.Reader. -type DecoderFactory func(io.Reader) Decoder - -// DecoderFor automatically detects the encoding of the first few bytes in -// the given io.Reader and then returns the corresponding Decoder or nil -// in case of failing to detect a supported encoding. -func DecoderFor(r io.Reader) Decoder { - var buf bytes.Buffer - for _, dec := range []DecoderFactory{ - NewDecoder, - NewJSONDecoder, - NewCSVDecoder, - } { - rd := io.MultiReader(bytes.NewReader(buf.Bytes()), io.TeeReader(r, &buf)) - if err := dec(rd).Decode(&Result{}); err == nil { - return dec(io.MultiReader(&buf, r)) - } - } - return nil -} - -// NewRoundRobinDecoder returns a new Decoder that round robins across the -// given Decoders on every invocation or decoding error. -func NewRoundRobinDecoder(dec ...Decoder) Decoder { - // Optimization for single Decoder case. - if len(dec) == 1 { - return dec[0] - } - - var seq uint64 - return func(r *Result) (err error) { - for range dec { - robin := seq % uint64(len(dec)) - seq++ - if err = dec[robin].Decode(r); err != nil { - continue - } - return nil - } - return err - } -} - -// NewDecoder returns a new gob Decoder for the given io.Reader. -func NewDecoder(rd io.Reader) Decoder { - dec := gob.NewDecoder(rd) - return func(r *Result) error { return dec.Decode(r) } -} - -// Decode is an an adapter method calling the Decoder function itself with the -// given parameters. -func (dec Decoder) Decode(r *Result) error { return dec(r) } - -// An Encoder encodes a Result and returns an error in case of failure. -type Encoder func(*Result) error - -// NewEncoder returns a new Result encoder closure for the given io.Writer -func NewEncoder(r io.Writer) Encoder { - enc := gob.NewEncoder(r) - return func(r *Result) error { return enc.Encode(r) } -} - -// Encode is an an adapter method calling the Encoder function itself with the -// given parameters. -func (enc Encoder) Encode(r *Result) error { return enc(r) } - -// NewCSVEncoder returns an Encoder that dumps the given *Result as a CSV -// record. The columns are: UNIX timestamp in ns since epoch, -// HTTP status code, request latency in ns, bytes out, bytes in, -// response body, and lastly the error. -func NewCSVEncoder(w io.Writer) Encoder { - enc := csv.NewWriter(w) - return func(r *Result) error { - err := enc.Write([]string{ - strconv.FormatInt(r.Timestamp.UnixNano(), 10), - strconv.FormatUint(uint64(r.Code), 10), - strconv.FormatInt(r.Latency.Nanoseconds(), 10), - strconv.FormatUint(r.BytesOut, 10), - strconv.FormatUint(r.BytesIn, 10), - r.Error, - base64.StdEncoding.EncodeToString(r.Body), - r.Attack, - strconv.FormatUint(r.Seq, 10), - }) - - if err != nil { - return err - } - - enc.Flush() - - return enc.Error() - } -} - -// NewCSVDecoder returns a Decoder that decodes CSV encoded Results. -func NewCSVDecoder(rd io.Reader) Decoder { - dec := csv.NewReader(rd) - dec.FieldsPerRecord = 9 - dec.TrimLeadingSpace = true - - return func(r *Result) error { - rec, err := dec.Read() - if err != nil { - return err - } - - ts, err := strconv.ParseInt(rec[0], 10, 64) - if err != nil { - return err - } - r.Timestamp = time.Unix(0, ts) - - code, err := strconv.ParseUint(rec[1], 10, 16) - if err != nil { - return err - } - r.Code = uint16(code) - - latency, err := strconv.ParseInt(rec[2], 10, 64) - if err != nil { - return err - } - r.Latency = time.Duration(latency) - - if r.BytesOut, err = strconv.ParseUint(rec[3], 10, 64); err != nil { - return err - } - - if r.BytesIn, err = strconv.ParseUint(rec[4], 10, 64); err != nil { - return err - } - - r.Error = rec[5] - r.Body, err = base64.StdEncoding.DecodeString(rec[6]) - - r.Attack = rec[7] - if r.Seq, err = strconv.ParseUint(rec[8], 10, 64); err != nil { - return err - } - - return err - } -} - -// NewJSONEncoder returns an Encoder that dumps the given *Results as a JSON -// object. -func NewJSONEncoder(w io.Writer) Encoder { - var jw jwriter.Writer - return func(r *Result) error { - (*jsonResult)(r).encode(&jw) - if jw.Error != nil { - return jw.Error - } - jw.RawByte('\n') - _, err := jw.DumpTo(w) - return err - } -} - -// NewJSONDecoder returns a Decoder that decodes JSON encoded Results. -func NewJSONDecoder(r io.Reader) Decoder { - rd := bufio.NewReader(r) - return func(r *Result) (err error) { - var jl jlexer.Lexer - if jl.Data, err = rd.ReadSlice('\n'); err != nil { - return err - } - (*jsonResult)(r).decode(&jl) - return jl.Error() - } -} diff --git a/vendor/github.com/tsenart/vegeta/lib/results_easyjson.go b/vendor/github.com/tsenart/vegeta/lib/results_easyjson.go deleted file mode 100644 index b1594bdc..00000000 --- a/vendor/github.com/tsenart/vegeta/lib/results_easyjson.go +++ /dev/null @@ -1,165 +0,0 @@ -// This file has been modified from the original generated code to make it work with -// type alias jsonResult so that the methods aren't exposed in Result. - -package vegeta - -import ( - "time" - - "github.com/mailru/easyjson/jlexer" - "github.com/mailru/easyjson/jwriter" -) - -type jsonResult Result - -func (r *jsonResult) decode(in *jlexer.Lexer) { - isTopLevel := in.IsStart() - if in.IsNull() { - if isTopLevel { - in.Consumed() - } - in.Skip() - return - } - in.Delim('{') - for !in.IsDelim('}') { - key := in.UnsafeString() - in.WantColon() - if in.IsNull() { - in.Skip() - in.WantComma() - continue - } - switch key { - case "attack": - r.Attack = string(in.String()) - case "seq": - r.Seq = uint64(in.Uint64()) - case "code": - r.Code = uint16(in.Uint16()) - case "timestamp": - if data := in.Raw(); in.Ok() { - in.AddError((r.Timestamp).UnmarshalJSON(data)) - } - case "latency": - r.Latency = time.Duration(in.Int64()) - case "bytes_out": - r.BytesOut = uint64(in.Uint64()) - case "bytes_in": - r.BytesIn = uint64(in.Uint64()) - case "error": - r.Error = string(in.String()) - case "body": - if in.IsNull() { - in.Skip() - r.Body = nil - } else { - r.Body = in.Bytes() - } - default: - in.SkipRecursive() - } - in.WantComma() - } - in.Delim('}') - if isTopLevel { - in.Consumed() - } -} - -func (r jsonResult) encode(out *jwriter.Writer) { - out.RawByte('{') - first := true - _ = first - { - const prefix string = ",\"attack\":" - if first { - first = false - out.RawString(prefix[1:]) - } else { - out.RawString(prefix) - } - out.String(string(r.Attack)) - } - { - const prefix string = ",\"seq\":" - if first { - first = false - out.RawString(prefix[1:]) - } else { - out.RawString(prefix) - } - out.Uint64(uint64(r.Seq)) - } - { - const prefix string = ",\"code\":" - if first { - first = false - out.RawString(prefix[1:]) - } else { - out.RawString(prefix) - } - out.Uint16(uint16(r.Code)) - } - { - const prefix string = ",\"timestamp\":" - if first { - first = false - out.RawString(prefix[1:]) - } else { - out.RawString(prefix) - } - out.Raw((r.Timestamp).MarshalJSON()) - } - { - const prefix string = ",\"latency\":" - if first { - first = false - out.RawString(prefix[1:]) - } else { - out.RawString(prefix) - } - out.Int64(int64(r.Latency)) - } - { - const prefix string = ",\"bytes_out\":" - if first { - first = false - out.RawString(prefix[1:]) - } else { - out.RawString(prefix) - } - out.Uint64(uint64(r.BytesOut)) - } - { - const prefix string = ",\"bytes_in\":" - if first { - first = false - out.RawString(prefix[1:]) - } else { - out.RawString(prefix) - } - out.Uint64(uint64(r.BytesIn)) - } - { - const prefix string = ",\"error\":" - if first { - first = false - out.RawString(prefix[1:]) - } else { - out.RawString(prefix) - } - out.String(string(r.Error)) - } - { - const prefix string = ",\"body\":" - if first { - first = false - out.RawString(prefix[1:]) - } else { - out.RawString(prefix) - } - out.Base64Bytes(r.Body) - } - out.RawByte('}') -} diff --git a/vendor/github.com/tsenart/vegeta/lib/target.schema.json b/vendor/github.com/tsenart/vegeta/lib/target.schema.json deleted file mode 100644 index 00286725..00000000 --- a/vendor/github.com/tsenart/vegeta/lib/target.schema.json +++ /dev/null @@ -1,39 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-04/schema#", - "$ref": "#/definitions/Target", - "definitions": { - "Target": { - "required": [ - "method", - "url" - ], - "properties": { - "body": { - "type": "string", - "media": { - "binaryEncoding": "base64" - } - }, - "header": { - "patternProperties": { - ".*": { - "items": { - "type": "string" - }, - "type": "array" - } - }, - "type": "object" - }, - "method": { - "type": "string" - }, - "url": { - "type": "string" - } - }, - "additionalProperties": false, - "type": "object" - } - } -} \ No newline at end of file diff --git a/vendor/github.com/tsenart/vegeta/lib/targets.go b/vendor/github.com/tsenart/vegeta/lib/targets.go deleted file mode 100644 index 41415ffb..00000000 --- a/vendor/github.com/tsenart/vegeta/lib/targets.go +++ /dev/null @@ -1,371 +0,0 @@ -package vegeta - -import ( - "bufio" - "bytes" - "errors" - "fmt" - "io" - "io/ioutil" - "net/http" - "net/url" - "regexp" - "strings" - "sync" - "sync/atomic" - - jlexer "github.com/mailru/easyjson/jlexer" - jwriter "github.com/mailru/easyjson/jwriter" -) - -// Target is an HTTP request blueprint. -// -//go:generate go run ../internal/cmd/jsonschema/main.go -type=Target -output=target.schema.json -type Target struct { - Method string `json:"method"` - URL string `json:"url"` - Body []byte `json:"body,omitempty"` - Header http.Header `json:"header,omitempty"` -} - -// Request creates an *http.Request out of Target and returns it along with an -// error in case of failure. -func (t *Target) Request() (*http.Request, error) { - req, err := http.NewRequest(t.Method, t.URL, bytes.NewReader(t.Body)) - if err != nil { - return nil, err - } - for k, vs := range t.Header { - req.Header[k] = make([]string, len(vs)) - copy(req.Header[k], vs) - } - if host := req.Header.Get("Host"); host != "" { - req.Host = host - } - return req, nil -} - -// Equal returns true if the target is equal to the other given target. -func (t *Target) Equal(other *Target) bool { - switch { - case t == other: - return true - case t == nil || other == nil: - return false - default: - equal := t.Method == other.Method && - t.URL == other.URL && - bytes.Equal(t.Body, other.Body) && - len(t.Header) == len(other.Header) - - if !equal { - return false - } - - for k := range t.Header { - left, right := t.Header[k], other.Header[k] - if len(left) != len(right) { - return false - } - for i := range left { - if left[i] != right[i] { - return false - } - } - } - - return true - } -} - -var ( - // ErrNoTargets is returned when not enough Targets are available. - ErrNoTargets = errors.New("no targets to attack") - // ErrNilTarget is returned when the passed Target pointer is nil. - ErrNilTarget = errors.New("nil target") - // ErrNoMethod is returned by JSONTargeter when a parsed Target has - // no method. - ErrNoMethod = errors.New("target: required method is missing") - // ErrNoURL is returned by JSONTargeter when a parsed Target has no - // URL. - ErrNoURL = errors.New("target: required url is missing") - // TargetFormats contains the canonical list of the valid target - // format identifiers. - TargetFormats = []string{HTTPTargetFormat, JSONTargetFormat} -) - -const ( - // HTTPTargetFormat is the human readable identifier for the HTTP target format. - HTTPTargetFormat = "http" - // JSONTargetFormat is the human readable identifier for the JSON target format. - JSONTargetFormat = "json" -) - -// A Targeter decodes a Target or returns an error in case of failure. -// Implementations must be safe for concurrent use. -type Targeter func(*Target) error - -// Decode is a convenience method that calls the underlying Targeter function. -func (tr Targeter) Decode(t *Target) error { - return tr(t) -} - -// NewJSONTargeter returns a new targeter that decodes one Target from the -// given io.Reader on every invocation. Each target is one JSON object in its own line. -// -// The method and url fields are required. If present, the body field must be base64 encoded. -// The generated [JSON Schema](lib/target.schema.json) defines the format in detail. -// -// {"method":"POST", "url":"https://goku/1", "header":{"Content-Type":["text/plain"], "body": "Rk9P"} -// {"method":"GET", "url":"https://goku/2"} -// -// body will be set as the Target's body if no body is provided in each target definiton. -// hdr will be merged with the each Target's headers. -// -func NewJSONTargeter(src io.Reader, body []byte, header http.Header) Targeter { - type reader struct { - *bufio.Reader - sync.Mutex - } - rd := reader{Reader: bufio.NewReader(src)} - - return func(tgt *Target) (err error) { - if tgt == nil { - return ErrNilTarget - } - - var jl jlexer.Lexer - - rd.Lock() - for len(jl.Data) == 0 { - if jl.Data, err = rd.ReadBytes('\n'); err != nil { - break - } - jl.Data = bytes.TrimSpace(jl.Data) // Skip empty lines - } - rd.Unlock() - - if err != nil { - if err == io.EOF { - err = ErrNoTargets - } - return err - } - - var t jsonTarget - t.decode(&jl) - - if err = jl.Error(); err != nil { - return err - } else if t.Method == "" { - return ErrNoMethod - } else if t.URL == "" { - return ErrNoURL - } - - tgt.Method = t.Method - tgt.URL = t.URL - if tgt.Body = body; len(t.Body) > 0 { - tgt.Body = t.Body - } - - if tgt.Header == nil { - tgt.Header = http.Header{} - } - - for k, vs := range header { - tgt.Header[k] = append(tgt.Header[k], vs...) - } - - for k, vs := range t.Header { - tgt.Header[k] = append(tgt.Header[k], vs...) - } - - return nil - } -} - -// A TargetEncoder encodes a Target in a format that can be read by a Targeter. -type TargetEncoder func(*Target) error - -// Encode is a convenience method that calls the underlying TargetEncoder function. -func (enc TargetEncoder) Encode(t *Target) error { - return enc(t) -} - -// NewJSONTargetEncoder returns a TargetEncoder that encods Targets in the JSON format. -func NewJSONTargetEncoder(w io.Writer) TargetEncoder { - var jw jwriter.Writer - return func(t *Target) error { - (*jsonTarget)(t).encode(&jw) - if jw.Error != nil { - return jw.Error - } - jw.RawByte('\n') - _, err := jw.DumpTo(w) - return err - } -} - -// NewStaticTargeter returns a Targeter which round-robins over the passed -// Targets. -func NewStaticTargeter(tgts ...Target) Targeter { - i := int64(-1) - return func(tgt *Target) error { - if tgt == nil { - return ErrNilTarget - } - *tgt = tgts[atomic.AddInt64(&i, 1)%int64(len(tgts))] - return nil - } -} - -// ReadAllTargets eagerly reads all Targets out of the provided Targeter. -func ReadAllTargets(t Targeter) (tgts []Target, err error) { - for { - var tgt Target - if err = t(&tgt); err == ErrNoTargets { - break - } else if err != nil { - return nil, err - } - tgts = append(tgts, tgt) - } - - if len(tgts) == 0 { - return nil, ErrNoTargets - } - - return tgts, nil -} - -// NewHTTPTargeter returns a new Targeter that decodes one Target from the -// given io.Reader on every invocation. The format is as follows: -// -// GET https://foo.bar/a/b/c -// Header-X: 123 -// Header-Y: 321 -// @/path/to/body/file -// -// POST https://foo.bar/b/c/a -// Header-X: 123 -// -// body will be set as the Target's body if no body is provided. -// hdr will be merged with the each Target's headers. -func NewHTTPTargeter(src io.Reader, body []byte, hdr http.Header) Targeter { - var mu sync.Mutex - sc := peekingScanner{src: bufio.NewScanner(src)} - return func(tgt *Target) (err error) { - mu.Lock() - defer mu.Unlock() - - if tgt == nil { - return ErrNilTarget - } - - var line string - for { - if !sc.Scan() { - return ErrNoTargets - } - line = strings.TrimSpace(sc.Text()) - - if len(line) != 0 && line[0] != '#'{ - break - } - } - - tgt.Body = body - tgt.Header = http.Header{} - for k, vs := range hdr { - tgt.Header[k] = vs - } - - tokens := strings.SplitN(line, " ", 2) - if len(tokens) < 2 { - return fmt.Errorf("bad target: %s", line) - } - if !startsWithHTTPMethod(line) { - return fmt.Errorf("bad method: %s", tokens[0]) - } - tgt.Method = tokens[0] - if _, err = url.ParseRequestURI(tokens[1]); err != nil { - return fmt.Errorf("bad URL: %s", tokens[1]) - } - tgt.URL = tokens[1] - line = strings.TrimSpace(sc.Peek()) - if line == "" || startsWithHTTPMethod(line) { - return nil - } - for sc.Scan() { - if line = strings.TrimSpace(sc.Text()); line == "" { - break - } else if strings.HasPrefix(line, "@") { - if tgt.Body, err = ioutil.ReadFile(line[1:]); err != nil { - return fmt.Errorf("bad body: %s", err) - } - break - } - tokens = strings.SplitN(line, ":", 2) - if len(tokens) < 2 { - return fmt.Errorf("bad header: %s", line) - } - for i := range tokens { - if tokens[i] = strings.TrimSpace(tokens[i]); tokens[i] == "" { - return fmt.Errorf("bad header: %s", line) - } - } - // Add key/value directly to the http.Header (map[string][]string). - // http.Header.Add() canonicalizes keys but vegeta is used - // to test systems that require case-sensitive headers. - tgt.Header[tokens[0]] = append(tgt.Header[tokens[0]], tokens[1]) - } - if err = sc.Err(); err != nil { - return ErrNoTargets - } - return nil - } -} - -var httpMethodChecker = regexp.MustCompile("^[A-Z]+\\s") - -// A line starts with an http method when the first word is uppercase ascii -// followed by a space. -func startsWithHTTPMethod(t string) bool { - return httpMethodChecker.MatchString(t) -} - -// Wrap a Scanner so we can cheat and look at the next value and react accordingly, -// but still have it be around the next time we Scan() + Text() -type peekingScanner struct { - src *bufio.Scanner - peeked string -} - -func (s *peekingScanner) Err() error { - return s.src.Err() -} - -func (s *peekingScanner) Peek() string { - if !s.src.Scan() { - return "" - } - s.peeked = s.src.Text() - return s.peeked -} - -func (s *peekingScanner) Scan() bool { - if s.peeked == "" { - return s.src.Scan() - } - return true -} - -func (s *peekingScanner) Text() string { - if s.peeked == "" { - return s.src.Text() - } - t := s.peeked - s.peeked = "" - return t -} diff --git a/vendor/github.com/tsenart/vegeta/lib/targets_easyjson.go b/vendor/github.com/tsenart/vegeta/lib/targets_easyjson.go deleted file mode 100644 index f2e54244..00000000 --- a/vendor/github.com/tsenart/vegeta/lib/targets_easyjson.go +++ /dev/null @@ -1,167 +0,0 @@ -// This file has been modified from the original generated code to make it work with -// type alias jsonTarget so that the methods aren't exposed in Target. - -package vegeta - -import ( - http "net/http" - - jlexer "github.com/mailru/easyjson/jlexer" - jwriter "github.com/mailru/easyjson/jwriter" -) - -type jsonTarget Target - -func (t *jsonTarget) decode(in *jlexer.Lexer) { - isTopLevel := in.IsStart() - if in.IsNull() { - if isTopLevel { - in.Consumed() - } - in.Skip() - return - } - in.Delim('{') - for !in.IsDelim('}') { - key := in.UnsafeString() - in.WantColon() - if in.IsNull() { - in.Skip() - in.WantComma() - continue - } - switch key { - case "method": - t.Method = string(in.String()) - case "url": - t.URL = string(in.String()) - case "body": - if in.IsNull() { - in.Skip() - t.Body = nil - } else { - t.Body = in.Bytes() - } - case "header": - if in.IsNull() { - in.Skip() - } else { - in.Delim('{') - if !in.IsDelim('}') { - t.Header = make(http.Header) - } else { - t.Header = nil - } - for !in.IsDelim('}') { - key := string(in.String()) - in.WantColon() - var v2 []string - if in.IsNull() { - in.Skip() - v2 = nil - } else { - in.Delim('[') - if v2 == nil { - if !in.IsDelim(']') { - v2 = make([]string, 0, 4) - } else { - v2 = []string{} - } - } else { - v2 = (v2)[:0] - } - for !in.IsDelim(']') { - var v3 string - v3 = string(in.String()) - v2 = append(v2, v3) - in.WantComma() - } - in.Delim(']') - } - (t.Header)[key] = v2 - in.WantComma() - } - in.Delim('}') - } - default: - in.SkipRecursive() - } - in.WantComma() - } - in.Delim('}') - if isTopLevel { - in.Consumed() - } -} - -func (t jsonTarget) encode(out *jwriter.Writer) { - out.RawByte('{') - first := true - _ = first - { - const prefix string = ",\"method\":" - if first { - first = false - out.RawString(prefix[1:]) - } else { - out.RawString(prefix) - } - out.String(string(t.Method)) - } - { - const prefix string = ",\"url\":" - if first { - first = false - out.RawString(prefix[1:]) - } else { - out.RawString(prefix) - } - out.String(string(t.URL)) - } - if len(t.Body) != 0 { - const prefix string = ",\"body\":" - if first { - first = false - out.RawString(prefix[1:]) - } else { - out.RawString(prefix) - } - out.Base64Bytes(t.Body) - } - if len(t.Header) != 0 { - const prefix string = ",\"header\":" - if first { - first = false - out.RawString(prefix[1:]) - } else { - out.RawString(prefix) - } - { - out.RawByte('{') - v6First := true - for v6Name, v6Value := range t.Header { - if v6First { - v6First = false - } else { - out.RawByte(',') - } - out.String(string(v6Name)) - out.RawByte(':') - if v6Value == nil && (out.Flags&jwriter.NilSliceAsEmpty) == 0 { - out.RawString("null") - } else { - out.RawByte('[') - for v7, v8 := range v6Value { - if v7 > 0 { - out.RawByte(',') - } - out.String(string(v8)) - } - out.RawByte(']') - } - } - out.RawByte('}') - } - } - out.RawByte('}') -} diff --git a/vendor/github.com/tsenart/vegeta/main.go b/vendor/github.com/tsenart/vegeta/main.go deleted file mode 100644 index f8c4b0e5..00000000 --- a/vendor/github.com/tsenart/vegeta/main.go +++ /dev/null @@ -1,117 +0,0 @@ -package main - -import ( - "flag" - "fmt" - "log" - "os" - "runtime" - "runtime/pprof" - "sort" - "strings" -) - -func main() { - commands := map[string]command{ - "attack": attackCmd(), - "report": reportCmd(), - "plot": plotCmd(), - "encode": encodeCmd(), - "dump": dumpCmd(), - } - - fs := flag.NewFlagSet("vegeta", flag.ExitOnError) - cpus := fs.Int("cpus", runtime.NumCPU(), "Number of CPUs to use") - profile := fs.String("profile", "", "Enable profiling of [cpu, heap]") - version := fs.Bool("version", false, "Print version and exit") - - fs.Usage = func() { - fmt.Fprintln(fs.Output(), "Usage: vegeta [global flags] [command flags]") - fmt.Fprintf(fs.Output(), "\nglobal flags:\n") - fs.PrintDefaults() - - names := make([]string, 0, len(commands)) - for name := range commands { - names = append(names, name) - } - - sort.Strings(names) - for _, name := range names { - if cmd := commands[name]; cmd.fs != nil { - fmt.Fprintf(fs.Output(),"\n%s command:\n", name) - cmd.fs.SetOutput(fs.Output()) - cmd.fs.PrintDefaults() - } - } - - fmt.Fprintln(fs.Output(), examples) - } - - fs.Parse(os.Args[1:]) - - if *version { - fmt.Printf("Version: %s\nCommit: %s\nRuntime: %s %s/%s\nDate: %s\n", - Version, - Commit, - runtime.Version(), - runtime.GOOS, - runtime.GOARCH, - Date, - ) - return - } - - runtime.GOMAXPROCS(*cpus) - - for _, prof := range strings.Split(*profile, ",") { - if prof = strings.TrimSpace(prof); prof == "" { - continue - } - - f, err := os.Create(prof + ".pprof") - if err != nil { - log.Fatal(err) - } - defer f.Close() - - switch { - case strings.HasPrefix(prof, "cpu"): - pprof.StartCPUProfile(f) - defer pprof.StopCPUProfile() - case strings.HasPrefix(prof, "heap"): - defer pprof.Lookup("heap").WriteTo(f, 0) - } - } - - args := fs.Args() - if len(args) == 0 { - fs.Usage() - os.Exit(1) - } - - if cmd, ok := commands[args[0]]; !ok { - log.Fatalf("Unknown command: %s", args[0]) - } else if err := cmd.fn(args[1:]); err != nil { - log.Fatal(err) - } -} - -// Set at linking time -var ( - Commit string - Date string - Version string -) - -const examples = ` -examples: - echo "GET http://localhost/" | vegeta attack -duration=5s | tee results.bin | vegeta report - vegeta report -type=json results.bin > metrics.json - cat results.bin | vegeta plot > plot.html - cat results.bin | vegeta report -type="hist[0,100ms,200ms,300ms]" -` - -type command struct { - fs *flag.FlagSet - fn func(args []string) error -} diff --git a/vendor/github.com/tsenart/vegeta/plot.go b/vendor/github.com/tsenart/vegeta/plot.go deleted file mode 100644 index f0420b74..00000000 --- a/vendor/github.com/tsenart/vegeta/plot.go +++ /dev/null @@ -1,109 +0,0 @@ -package main - -import ( - "flag" - "fmt" - "io" - "os" - "os/signal" - - vegeta "github.com/tsenart/vegeta/lib" - "github.com/tsenart/vegeta/lib/plot" -) - -const plotUsage = `Usage: vegeta plot [options] [...] - -Outputs an HTML time series plot of request latencies over time. -The X axis represents elapsed time in seconds from the beginning -of the earliest attack in all input files. The Y axis represents -request latency in milliseconds. - -Click and drag to select a region to zoom into. Double click to zoom out. -Choose a different number on the bottom left corner input field -to change the moving average window size (in data points). - -Arguments: - A file with vegeta attack results encoded with one of - the supported encodings (gob | json | csv) [default: stdin] - -Options: - --title Title and header of the resulting HTML page. - [default: Vegeta Plot] - --threshold Threshold of data points to downsample series to. - Series with less than --threshold number of data - points are not downsampled. [default: 4000] - -Examples: - echo "GET http://:80" | vegeta attack -name=50qps -rate=50 -duration=5s > results.50qps.bin - cat results.50qps.bin | vegeta plot > plot.50qps.html - echo "GET http://:80" | vegeta attack -name=100qps -rate=100 -duration=5s > results.100qps.bin - vegeta plot results.50qps.bin results.100qps.bin > plot.html -` - -func plotCmd() command { - fs := flag.NewFlagSet("vegeta plot", flag.ExitOnError) - title := fs.String("title", "Vegeta Plot", "Title and header of the resulting HTML page") - threshold := fs.Int("threshold", 4000, "Threshold of data points above which series are downsampled.") - output := fs.String("output", "stdout", "Output file") - - fs.Usage = func() { - fmt.Fprintln(os.Stderr, plotUsage) - } - - return command{fs, func(args []string) error { - fs.Parse(args) - files := fs.Args() - if len(files) == 0 { - files = append(files, "stdin") - } - return plotRun(files, *threshold, *title, *output) - }} -} - -func plotRun(files []string, threshold int, title, output string) error { - dec, mc, err := decoder(files) - defer mc.Close() - if err != nil { - return err - } - - out, err := file(output, true) - if err != nil { - return err - } - defer out.Close() - - sigch := make(chan os.Signal, 1) - signal.Notify(sigch, os.Interrupt) - - p := plot.New( - plot.Title(title), - plot.Downsample(threshold), - plot.Label(plot.ErrorLabeler), - ) - -decode: - for { - select { - case <-sigch: - break decode - default: - var r vegeta.Result - if err = dec.Decode(&r); err != nil { - if err == io.EOF { - break decode - } - return err - } - - if err = p.Add(&r); err != nil { - return err - } - } - } - - p.Close() - - _, err = p.WriteTo(out) - return err -} diff --git a/vendor/github.com/tsenart/vegeta/report.go b/vendor/github.com/tsenart/vegeta/report.go deleted file mode 100644 index cab8a13e..00000000 --- a/vendor/github.com/tsenart/vegeta/report.go +++ /dev/null @@ -1,169 +0,0 @@ -package main - -import ( - "flag" - "fmt" - "io" - "os" - "os/signal" - "strings" - "time" - - vegeta "github.com/tsenart/vegeta/lib" -) - -const reportUsage = `Usage: vegeta report [options] [...] - -Outputs a report of attack results. - -Arguments: - A file with vegeta attack results encoded with one of - the supported encodings (gob | json | csv) [default: stdin] - -Options: - --type Which report type to generate (text | json | hist[buckets] | hdrplot). - [default: text] - - --every Write the report to --output at every given interval (e.g 100ms) - The default of 0 means the report will only be written after - all results have been processed. [default: 0] - - --output Output file [default: stdout] - -Examples: - echo "GET http://:80" | vegeta attack -rate=10/s > results.gob - echo "GET http://:80" | vegeta attack -rate=100/s | vegeta encode > results.json - vegeta report results.* -` - -func reportCmd() command { - fs := flag.NewFlagSet("vegeta report", flag.ExitOnError) - typ := fs.String("type", "text", "Report type to generate [text, json, hist[buckets], hdrplot]") - every := fs.Duration("every", 0, "Report interval") - output := fs.String("output", "stdout", "Output file") - buckets := fs.String("buckets", "", "Histogram buckets, e.g.: \"[0,1ms,10ms]\"") - - fs.Usage = func() { - fmt.Fprintln(os.Stderr, reportUsage) - } - - return command{fs, func(args []string) error { - fs.Parse(args) - files := fs.Args() - if len(files) == 0 { - files = append(files, "stdin") - } - return report(files, *typ, *output, *every, *buckets) - }} -} - -func report(files []string, typ, output string, every time.Duration, bucketsStr string) error { - if len(typ) < 4 { - return fmt.Errorf("invalid report type: %s", typ) - } - - dec, mc, err := decoder(files) - defer mc.Close() - if err != nil { - return err - } - - out, err := file(output, true) - if err != nil { - return err - } - defer out.Close() - - var ( - rep vegeta.Reporter - report vegeta.Report - ) - - switch typ { - case "plot": - return fmt.Errorf("The plot reporter has been deprecated and succeeded by the vegeta plot command") - case "text": - var m vegeta.Metrics - rep, report = vegeta.NewTextReporter(&m), &m - case "json": - var m vegeta.Metrics - if bucketsStr != "" { - m.Histogram = &vegeta.Histogram{} - if err := m.Histogram.Buckets.UnmarshalText([]byte(bucketsStr)); err != nil { - return err - } - } - rep, report = vegeta.NewJSONReporter(&m), &m - case "hdrplot": - var m vegeta.Metrics - rep, report = vegeta.NewHDRHistogramPlotReporter(&m), &m - default: - switch { - case strings.HasPrefix(typ, "hist"): - var hist vegeta.Histogram - if bucketsStr == "" { // Old way - if len(typ) < 6 { - return fmt.Errorf("bad buckets: '%s'", typ[4:]) - } - bucketsStr = typ[4:] - } - if err := hist.Buckets.UnmarshalText([]byte(bucketsStr)); err != nil { - return err - } - rep, report = vegeta.NewHistogramReporter(&hist), &hist - default: - return fmt.Errorf("unknown report type: %q", typ) - } - } - - sigch := make(chan os.Signal, 1) - signal.Notify(sigch, os.Interrupt) - - var ticks <-chan time.Time - if every > 0 { - ticker := time.NewTicker(every) - defer ticker.Stop() - ticks = ticker.C - } - - rc, _ := report.(vegeta.Closer) -decode: - for { - select { - case <-sigch: - break decode - case <-ticks: - if err = clear(out); err != nil { - return err - } else if err = writeReport(rep, rc, out); err != nil { - return err - } - default: - var r vegeta.Result - if err = dec.Decode(&r); err != nil { - if err == io.EOF { - break decode - } - return err - } - - report.Add(&r) - } - } - - return writeReport(rep, rc, out) -} - -func writeReport(r vegeta.Reporter, rc vegeta.Closer, out io.Writer) error { - if rc != nil { - rc.Close() - } - return r.Report(out) -} - -func clear(out io.Writer) error { - if f, ok := out.(*os.File); ok && f == os.Stdout { - return clearScreen() - } - return nil -} diff --git a/vendor/github.com/tsenart/vegeta/report_nonwindows.go b/vendor/github.com/tsenart/vegeta/report_nonwindows.go deleted file mode 100644 index 48e8ceb1..00000000 --- a/vendor/github.com/tsenart/vegeta/report_nonwindows.go +++ /dev/null @@ -1,14 +0,0 @@ -// +build !windows - -package main - -import ( - "os" -) - -var escCodes = []byte("\033[2J\033[0;0H") - -func clearScreen() error { - _, err := os.Stdout.Write(escCodes) - return err -} diff --git a/vendor/github.com/tsenart/vegeta/report_windows.go b/vendor/github.com/tsenart/vegeta/report_windows.go deleted file mode 100644 index cf1db6d7..00000000 --- a/vendor/github.com/tsenart/vegeta/report_windows.go +++ /dev/null @@ -1,14 +0,0 @@ -// +build windows - -package main - -import ( - "os" - "os/exec" -) - -func clearScreen() error { - cmd := exec.Command("cmd", "/c", "cls") - cmd.Stdout = os.Stdout - return cmd.Run() -} diff --git a/vendor/golang.org/x/time/rate/rate.go b/vendor/golang.org/x/time/rate/rate.go index 0cfcc846..a98fe778 100644 --- a/vendor/golang.org/x/time/rate/rate.go +++ b/vendor/golang.org/x/time/rate/rate.go @@ -145,6 +145,7 @@ func (r *Reservation) DelayFrom(now time.Time) time.Duration { // Cancel is shorthand for CancelAt(time.Now()). func (r *Reservation) Cancel() { r.CancelAt(time.Now()) + return } // CancelAt indicates that the reservation holder will not perform the reserved action @@ -185,6 +186,8 @@ func (r *Reservation) CancelAt(now time.Time) { r.lim.lastEvent = prevEvent } } + + return } // Reserve is shorthand for ReserveN(time.Now(), 1). @@ -364,13 +367,20 @@ func (lim *Limiter) advance(now time.Time) (newNow time.Time, newLast time.Time, last = now } - // Calculate the new number of tokens, due to time that passed. + // Avoid making delta overflow below when last is very old. + maxElapsed := lim.limit.durationFromTokens(float64(lim.burst) - lim.tokens) elapsed := now.Sub(last) + if elapsed > maxElapsed { + elapsed = maxElapsed + } + + // Calculate the new number of tokens, due to time that passed. delta := lim.limit.tokensFromDuration(elapsed) tokens := lim.tokens + delta if burst := float64(lim.burst); tokens > burst { tokens = burst } + return now, last, tokens } @@ -378,11 +388,15 @@ func (lim *Limiter) advance(now time.Time) (newNow time.Time, newLast time.Time, // of time it takes to accumulate them at a rate of limit tokens per second. func (limit Limit) durationFromTokens(tokens float64) time.Duration { seconds := tokens / float64(limit) - return time.Duration(float64(time.Second) * seconds) + return time.Nanosecond * time.Duration(1e9*seconds) } // tokensFromDuration is a unit conversion function from a time duration to the number of tokens // which could be accumulated during that duration at a rate of limit tokens per second. func (limit Limit) tokensFromDuration(d time.Duration) float64 { - return d.Seconds() * float64(limit) + // Split the integer and fractional parts ourself to minimize rounding errors. + // See golang.org/issues/34861. + sec := float64(d/time.Second) * float64(limit) + nsec := float64(d%time.Second) * float64(limit) + return sec + nsec/1e9 } diff --git a/vendor/modules.txt b/vendor/modules.txt index 6254e884..7e3f6cd3 100644 --- a/vendor/modules.txt +++ b/vendor/modules.txt @@ -10,9 +10,6 @@ github.com/PuerkitoBio/urlesc github.com/beorn7/perks/quantile # github.com/blendle/zapdriver v1.3.1 github.com/blendle/zapdriver -# github.com/c2h5oh/datasize v0.0.0-20200112174442-28bbd4740fee -## explicit -github.com/c2h5oh/datasize # github.com/census-instrumentation/opencensus-proto v0.3.0 github.com/census-instrumentation/opencensus-proto/gen-go/agent/common/v1 github.com/census-instrumentation/opencensus-proto/gen-go/agent/metrics/v1 @@ -24,8 +21,6 @@ github.com/census-instrumentation/opencensus-proto/gen-go/trace/v1 github.com/cespare/xxhash/v2 # github.com/davecgh/go-spew v1.1.1 github.com/davecgh/go-spew/spew -# github.com/dgryski/go-gk v0.0.0-20200319235926-a69029f61654 -## explicit # github.com/emicklei/go-restful v2.9.5+incompatible github.com/emicklei/go-restful github.com/emicklei/go-restful/log @@ -40,17 +35,13 @@ github.com/go-kit/log/level github.com/go-logfmt/logfmt # github.com/go-logr/logr v0.4.0 github.com/go-logr/logr -# github.com/go-openapi/jsonpointer v0.19.5 -## explicit +# github.com/go-openapi/jsonpointer v0.19.3 github.com/go-openapi/jsonpointer -# github.com/go-openapi/jsonreference v0.19.5 -## explicit +# github.com/go-openapi/jsonreference v0.19.3 github.com/go-openapi/jsonreference -# github.com/go-openapi/spec v0.19.6 -## explicit +# github.com/go-openapi/spec v0.19.5 github.com/go-openapi/spec -# github.com/go-openapi/swag v0.19.15 -## explicit +# github.com/go-openapi/swag v0.19.5 github.com/go-openapi/swag # github.com/gogo/protobuf v1.3.2 github.com/gogo/protobuf/proto @@ -77,14 +68,6 @@ github.com/google/go-cmp/cmp/internal/value # github.com/google/gofuzz v1.2.0 github.com/google/gofuzz github.com/google/gofuzz/bytesource -# github.com/google/licenseclassifier v0.0.0-20200708223521-3d09a0ea2f39 -## explicit -github.com/google/licenseclassifier -github.com/google/licenseclassifier/internal/sets -github.com/google/licenseclassifier/stringclassifier -github.com/google/licenseclassifier/stringclassifier/internal/pq -github.com/google/licenseclassifier/stringclassifier/searchset -github.com/google/licenseclassifier/stringclassifier/searchset/tokenizer # github.com/google/uuid v1.3.0 github.com/google/uuid # github.com/googleapis/gnostic v0.4.1 @@ -98,27 +81,18 @@ github.com/grpc-ecosystem/grpc-gateway/utilities # github.com/hashicorp/golang-lru v0.5.4 github.com/hashicorp/golang-lru github.com/hashicorp/golang-lru/simplelru -# github.com/imdario/mergo v0.3.9 -## explicit +# github.com/imdario/mergo v0.3.5 github.com/imdario/mergo -# github.com/influxdata/tdigest v0.0.1 -## explicit -github.com/influxdata/tdigest -# github.com/josharian/intern v1.0.0 -github.com/josharian/intern # github.com/json-iterator/go v1.1.11 github.com/json-iterator/go # github.com/kelseyhightower/envconfig v1.4.0 github.com/kelseyhightower/envconfig -# github.com/mailru/easyjson v0.7.7 -## explicit +# github.com/mailru/easyjson v0.7.0 github.com/mailru/easyjson/buffer github.com/mailru/easyjson/jlexer github.com/mailru/easyjson/jwriter # github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369 github.com/matttproud/golang_protobuf_extensions/pbutil -# github.com/miekg/dns v1.1.29 -## explicit # github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd github.com/modern-go/concurrent # github.com/modern-go/reflect2 v1.0.1 @@ -142,22 +116,8 @@ github.com/prometheus/procfs/internal/util # github.com/prometheus/statsd_exporter v0.21.0 github.com/prometheus/statsd_exporter/pkg/mapper github.com/prometheus/statsd_exporter/pkg/mapper/fsm -# github.com/sergi/go-diff v1.1.0 -## explicit -github.com/sergi/go-diff/diffmatchpatch # github.com/spf13/pflag v1.0.5 github.com/spf13/pflag -# github.com/tsenart/go-tsz v0.0.0-20180814235614-0bd30b3df1c3 -## explicit -github.com/tsenart/go-tsz -github.com/tsenart/go-tsz/testdata -# github.com/tsenart/vegeta v12.7.1-0.20190725001342-b5f4fca92137+incompatible -## explicit -github.com/tsenart/vegeta -github.com/tsenart/vegeta/internal/resolver -github.com/tsenart/vegeta/lib -github.com/tsenart/vegeta/lib/lttb -github.com/tsenart/vegeta/lib/plot # go.opencensus.io v0.23.0 go.opencensus.io go.opencensus.io/internal @@ -220,8 +180,7 @@ golang.org/x/text/transform golang.org/x/text/unicode/bidi golang.org/x/text/unicode/norm golang.org/x/text/width -# golang.org/x/time v0.0.0-20210723032227-1f47c861a9ac -## explicit +# golang.org/x/time v0.0.0-20210220033141-f8bda1e9f3ba golang.org/x/time/rate # golang.org/x/tools v0.1.8 golang.org/x/tools/go/ast/astutil