diff --git a/go.mod b/go.mod index c246a71fd84d..c7d8a7b88c03 100644 --- a/go.mod +++ b/go.mod @@ -11,17 +11,17 @@ require ( github.com/google/go-containerregistry/pkg/authn/k8schain v0.0.0-20230209165335-3624968304fd github.com/google/gofuzz v1.2.0 github.com/google/mako v0.0.0-20190821191249-122f8dcef9e3 - github.com/gorilla/websocket v1.4.2 + github.com/gorilla/websocket v1.5.0 github.com/hashicorp/golang-lru v0.5.4 github.com/influxdata/influxdb-client-go/v2 v2.9.0 github.com/kelseyhightower/envconfig v1.4.0 - github.com/tsenart/vegeta/v12 v12.8.4 + github.com/tsenart/vegeta/v12 v12.11.0 go.opencensus.io v0.24.0 go.uber.org/atomic v1.9.0 go.uber.org/automaxprocs v1.4.0 - go.uber.org/zap v1.19.1 + go.uber.org/zap v1.24.0 golang.org/x/net v0.12.0 - golang.org/x/sync v0.2.0 + golang.org/x/sync v0.3.0 golang.org/x/time v0.3.0 google.golang.org/api v0.124.0 google.golang.org/grpc v1.56.1 @@ -32,10 +32,10 @@ require ( k8s.io/code-generator v0.26.5 k8s.io/kube-openapi v0.0.0-20221012153701-172d655c2280 k8s.io/utils v0.0.0-20221108210102-8e77b1f39fe2 - knative.dev/caching v0.0.0-20230718155311-24ff72399d90 - knative.dev/hack v0.0.0-20230712131415-ddae80293c43 - knative.dev/networking v0.0.0-20230718160410-75dcd54d9510 - knative.dev/pkg v0.0.0-20230718152110-aef227e72ead + knative.dev/caching v0.0.0-20230802013852-e03e9f6594b3 + knative.dev/hack v0.0.0-20230802014852-338500eed425 + knative.dev/networking v0.0.0-20230802091048-29da3ac7ef4d + knative.dev/pkg v0.0.0-20230802191948-8d3f95106327 sigs.k8s.io/yaml v1.3.0 ) @@ -69,10 +69,11 @@ require ( github.com/aws/aws-sdk-go-v2/service/sts v1.16.19 // indirect github.com/aws/smithy-go v1.13.3 // indirect github.com/awslabs/amazon-ecr-credential-helper/ecr-login v0.0.0-20221004211355-a250ad2ca1e3 // indirect + github.com/benbjohnson/clock v1.1.0 // indirect github.com/beorn7/perks v1.0.1 // indirect github.com/blang/semver/v4 v4.0.0 // indirect github.com/blendle/zapdriver v1.3.1 // indirect - github.com/c2h5oh/datasize v0.0.0-20200112174442-28bbd4740fee // indirect + github.com/c2h5oh/datasize v0.0.0-20220606134207-859f65c6625b // indirect github.com/census-instrumentation/opencensus-proto v0.4.1 // indirect github.com/cespare/xxhash/v2 v2.2.0 // indirect github.com/chrismellard/docker-credential-acr-env v0.0.0-20221002210726-e883f69e0206 // indirect @@ -86,7 +87,7 @@ require ( github.com/emicklei/go-restful/v3 v3.9.0 // indirect github.com/evanphx/json-patch v4.12.0+incompatible // indirect github.com/evanphx/json-patch/v5 v5.6.0 // indirect - github.com/go-kit/log v0.2.0 // indirect + github.com/go-kit/log v0.2.1 // indirect github.com/go-logfmt/logfmt v0.5.1 // indirect github.com/go-logr/logr v1.2.3 // indirect github.com/go-openapi/jsonpointer v0.19.5 // indirect @@ -114,8 +115,7 @@ require ( github.com/json-iterator/go v1.1.12 // indirect github.com/klauspost/compress v1.15.11 // indirect github.com/mailru/easyjson v0.7.7 // indirect - github.com/matttproud/golang_protobuf_extensions v1.0.2 // indirect - github.com/miekg/dns v1.1.41 // indirect + github.com/matttproud/golang_protobuf_extensions v1.0.4 // indirect github.com/mitchellh/go-homedir v1.1.0 // indirect github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect github.com/modern-go/reflect2 v1.0.2 // indirect @@ -124,11 +124,12 @@ require ( github.com/opencontainers/image-spec v1.1.0-rc2 // indirect github.com/openzipkin/zipkin-go v0.3.0 // indirect github.com/pkg/errors v0.9.1 // indirect - github.com/prometheus/client_golang v1.14.0 // indirect - github.com/prometheus/client_model v0.3.0 // indirect - github.com/prometheus/common v0.37.0 // indirect - github.com/prometheus/procfs v0.8.0 // indirect + github.com/prometheus/client_golang v1.16.0 // indirect + github.com/prometheus/client_model v0.4.0 // indirect + github.com/prometheus/common v0.44.0 // indirect + github.com/prometheus/procfs v0.10.1 // indirect github.com/prometheus/statsd_exporter v0.21.0 // indirect + github.com/rs/dnscache v0.0.0-20211102005908-e0241e321417 // indirect github.com/russross/blackfriday/v2 v2.1.0 // indirect github.com/sirupsen/logrus v1.9.0 // indirect github.com/spf13/pflag v1.0.5 // indirect @@ -136,12 +137,12 @@ require ( github.com/vbatts/tar-split v0.11.2 // indirect go.uber.org/multierr v1.6.0 // indirect golang.org/x/crypto v0.11.0 // indirect - golang.org/x/mod v0.9.0 // indirect + golang.org/x/mod v0.12.0 // indirect golang.org/x/oauth2 v0.8.0 // indirect golang.org/x/sys v0.10.0 // indirect golang.org/x/term v0.10.0 // indirect golang.org/x/text v0.11.0 // indirect - golang.org/x/tools v0.7.0 // indirect + golang.org/x/tools v0.11.0 // indirect gomodules.xyz/jsonpatch/v2 v2.2.0 // indirect google.golang.org/appengine v1.6.7 // indirect google.golang.org/genproto v0.0.0-20230525234025-438c736192d0 // indirect diff --git a/go.sum b/go.sum index 85c5eb4c2326..9bf5be4a66d3 100644 --- a/go.sum +++ b/go.sum @@ -74,7 +74,6 @@ github.com/Shopify/toxiproxy v2.1.4+incompatible/go.mod h1:OXgGpZ6Cli1/URJOF1DMx github.com/Shopify/toxiproxy/v2 v2.1.6-0.20210914104332-15ea381dcdae/go.mod h1:/cvHQkZ1fst0EmZnA5dFtiQdWCNCFYzb+uE2vqVgvx0= github.com/ahmetb/gen-crd-api-reference-docs v0.3.1-0.20210609063737-0067dc6dcea2 h1:t/ces1/q8tuApSb+T5ajsu3wqkofUT43U1gpDYTPYME= github.com/ahmetb/gen-crd-api-reference-docs v0.3.1-0.20210609063737-0067dc6dcea2/go.mod h1:TdjdkYhlOifCQWPs1UdTma97kQQMozf5h26hTuG70u8= -github.com/alecthomas/jsonschema v0.0.0-20180308105923-f2c93856175a/go.mod h1:qpebaTNSsyUn5rPSJMsfqEtDw71TTggXM6stUDI16HA= github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= @@ -121,18 +120,15 @@ github.com/blang/semver/v4 v4.0.0 h1:1PFHFE6yCCTv8C1TeyNNarDzntLi7wMI5i/pzqYIsAM 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/bmizerany/perks v0.0.0-20230307044200-03f9df79da1e h1:mWOqoK5jV13ChKf/aF3plwQ96laasTJgZi4f1aSOu+M= github.com/buger/jsonparser v1.1.1/go.mod h1:6RYKKt7H4d4+iWqouImQ9R2FZql3VbhNgx27UK13J/0= -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/c2h5oh/datasize v0.0.0-20220606134207-859f65c6625b h1:6+ZFm0flnudZzdSE0JxlhR2hKnGPcNB35BjQf4RYQDY= +github.com/c2h5oh/datasize v0.0.0-20220606134207-859f65c6625b/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.4.1 h1:iKLQ0xPNFxR/2hzXZMrBo8f1j86j5WHzznCCQxV/b8g= github.com/census-instrumentation/opencensus-proto v0.4.1/go.mod h1:4T9NM4+4Vw91VeyqjLS6ao50K5bOcLKN6Q42XnYaRYw= github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= -github.com/cespare/xxhash/v2 v2.1.2/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44= github.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/chrismellard/docker-credential-acr-env v0.0.0-20221002210726-e883f69e0206 h1:lG6Usi/kX/JBZzGz1H+nV+KwM97vThQeKunCbS6PutU= @@ -160,10 +156,8 @@ github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSs github.com/deepmap/oapi-codegen v1.8.2 h1:SegyeYGcdi0jLLrpbCMoJxnUUn8GBXHsvr4rbzjuhfU= github.com/deepmap/oapi-codegen v1.8.2/go.mod h1:YLgSKSDv/bZQB7N4ws6luhozi3cEdRktEqrX88CvjIw= 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-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-lttb v0.0.0-20230207170358-f8fc36cdbff1 h1:dxwR3CStJdJamsIoMPCmxuIfBAPTgmzvFax+MvFav3M= github.com/dimchansky/utfbom v1.1.1 h1:vV6w1AhK4VMnhBno/TPVCoK9U/LP0PkLCS9tbxHdi/U= github.com/dimchansky/utfbom v1.1.1/go.mod h1:SxdoEBH5qIqFocHMyGOXVAybYJdr71b1Q/j0mACtrfE= github.com/docker/cli v20.10.20+incompatible h1:lWQbHSHUFs7KraSN2jOJK7zbMS2jNCHI4mt4xUFUVQ4= @@ -208,8 +202,8 @@ github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2 github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= github.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vbaY= -github.com/go-kit/log v0.2.0 h1:7i2K3eKTos3Vc0enKCfnVcgHh2olr/MyfboYq7cAcFw= -github.com/go-kit/log v0.2.0/go.mod h1:NwTd00d/i8cPZ3xOwwiv2PO5MOcx78fFErGNcVmBjv0= +github.com/go-kit/log v0.2.1 h1:MRVx0/zhvdseW+Gza6N9rVzU/IVzaeE1SFI4raAhmBU= +github.com/go-kit/log v0.2.1/go.mod h1:NwTd00d/i8cPZ3xOwwiv2PO5MOcx78fFErGNcVmBjv0= github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A= @@ -277,15 +271,6 @@ github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiu github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/golangci/lint-1 v0.0.0-20181222135242-d2cdd8c08219/go.mod h1:/X8TswGSh1pIozq4ZwCfxS0WA5JGXguxk94ar/4c87Y= -github.com/gonum/blas v0.0.0-20181208220705-f22b278b28ac/go.mod h1:P32wAyui1PQ58Oce/KYkOqQv8cVw1zAapXOl+dRFGbc= -github.com/gonum/diff v0.0.0-20181124234638-500114f11e71/go.mod h1:22dM4PLscQl+Nzf64qNBurVJvfyvZELT0iRW2l/NN70= -github.com/gonum/floats v0.0.0-20181209220543-c233463c7e82/go.mod h1:PxC8OnwL11+aosOB5+iEPoV3picfs8tUpkVd0pDo+Kg= -github.com/gonum/integrate v0.0.0-20181209220457-a422b5c0fdf2/go.mod h1:pDgmNM6seYpwvPos3q+zxlXMsbve6mOIPucUnUOrI7Y= -github.com/gonum/internal v0.0.0-20181124074243-f884aa714029/go.mod h1:Pu4dmpkhSyOzRwuXkOgAvijx4o+4YMUJJo9OvPYMkks= -github.com/gonum/lapack v0.0.0-20181123203213-e4cdc5a0bff9/go.mod h1:XA3DeT6rxh2EAE789SSiSJNqxPaC0aE9J8NTOI0Jo/A= -github.com/gonum/mathext v0.0.0-20181121095525-8a4bf007ea55/go.mod h1:fmo8aiSEWkJeiGXUJf+sPvuDgEFgqIoZSs843ePKrGg= -github.com/gonum/matrix v0.0.0-20181209220409-c518dec07be9/go.mod h1:0EXg4mc1CNP0HCqCz+K4ts155PXIlUywf0wqN+GfPZw= -github.com/gonum/stat v0.0.0-20181125101827-41a0da705a5b/go.mod h1:Z4GIJBJO3Wa4gD4vbwQxXXZ+WHmW6E9ixmNrwvs0iZs= github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/gnostic v0.6.9 h1:ZK/5VhkoX835RikCHpSUJV9a+S3e1zLh59YnyWeBW+0= @@ -345,8 +330,9 @@ github.com/gorilla/mux v1.6.2/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2z github.com/gorilla/mux v1.8.0/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So= github.com/gorilla/securecookie v1.1.1/go.mod h1:ra0sb63/xPlUeL+yeDciTfxMRAA+MP+HVt/4epWDjd4= github.com/gorilla/sessions v1.2.1/go.mod h1:dk2InVEVJ0sfLlnXv9EAgkf6ecYs/i80K/zI+bUmuGM= -github.com/gorilla/websocket v1.4.2 h1:+/TMaTYc4QFitKJxsQ7Yye35DkWvkdLcvGKqM+x0Ufc= -github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= +github.com/gorilla/websocket v1.5.0 h1:PPwGk2jz7EePpoHN/+ClbZu8SPxiqlu12wZP/3sWmnc= +github.com/gorilla/websocket v1.5.0/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= +github.com/grafana/regexp v0.0.0-20221122212121-6b5c0a4cb7fd h1:PpuIBO5P3e9hpqBD0O/HjhShYuM6XE0i/lbE6J94kww= github.com/grpc-ecosystem/grpc-gateway v1.14.6/go.mod h1:zdiPV4Yse/1gnckTHtghG4GkDEdKCRJduHpTxT3/jcw= github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= github.com/grpc-ecosystem/grpc-gateway/v2 v2.11.3 h1:lLT7ZLSzGLI08vc9cpd+tYmNWjdKDqyr/2L+f6U12Fk= @@ -364,7 +350,6 @@ github.com/influxdata/influxdb-client-go/v2 v2.9.0 h1:1Ejxpt+cpWkadefxd5xvVx7pFg github.com/influxdata/influxdb-client-go/v2 v2.9.0/go.mod h1:x7Jo5UHHl+w8wu8UnGiNobDDHygojXwJX4mx7rXGKMk= github.com/influxdata/line-protocol v0.0.0-20200327222509-2487e7298839 h1:W9WBk7wlPfJLvMCdtV4zPulc4uCPrlywQOmbFOhgQNU= github.com/influxdata/line-protocol v0.0.0-20200327222509-2487e7298839/go.mod h1:xaLFMmpvUxqXtVkUJfg9QmT88cDaCJ3ZKgdZ78oO8Qo= -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= @@ -403,7 +388,7 @@ github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFB github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= -github.com/kr/pretty v0.3.0 h1:WgNl7dwNpEZ6jJ9k1snq4pZsg7DOEN8hP9Xw0Tsjwk0= +github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= 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= @@ -413,7 +398,6 @@ github.com/labstack/gommon v0.3.0/go.mod h1:MULnywXg0yavhxWKc+lOruYdAhDwPK9wf0OL github.com/lyft/protoc-gen-validate v0.0.13/go.mod h1:XbGvPuh87YZc5TdIa2/I4pLk0QoUACkjt2znoq26NVQ= 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/go.mod h1:KAzv3t3aY1NaHWoQz1+4F1ccyAH66Jk7yos7ldAVICs= github.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0= github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= github.com/matryer/moq v0.0.0-20190312154309-6cfb0558e1bd/go.mod h1:9ELz6aaclSIGnZBoaSLZ3NAl1VTufbOrXBPvtcy6WiQ= @@ -424,11 +408,9 @@ github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hd github.com/mattn/go-isatty v0.0.9/go.mod h1:YNRxwqDuOph6SZLI9vUUz6OYw3QyUt7WiY2yME+cCiQ= github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= -github.com/matttproud/golang_protobuf_extensions v1.0.2 h1:hAHbPm5IJGijwng3PWk09JkG9WeqChjprR5s9bBZ+OM= -github.com/matttproud/golang_protobuf_extensions v1.0.2/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4= -github.com/miekg/dns v1.1.17/go.mod h1:WgzbA6oji13JREwiNsRDNfl7jYdPnmz+VEuLrA+/48M= -github.com/miekg/dns v1.1.41 h1:WMszZWJG0XmzbK9FEmzH2TVcqYzFesusSIB41b8KHxY= -github.com/miekg/dns v1.1.41/go.mod h1:p6aan82bvRIyn+zDIv9xYNUpwa73JcSh9BKwknJysuI= +github.com/matttproud/golang_protobuf_extensions v1.0.4 h1:mmDVorXM7PCGKw94cs5zkfA9PSy5pEvNWRP0ET0TIVo= +github.com/matttproud/golang_protobuf_extensions v1.0.4/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4= +github.com/miekg/dns v1.1.55 h1:GoQ4hpsj0nFLYe+bWiCToyrBEJXkQfOOIvFGFy0lEgo= github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y= github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= @@ -476,29 +458,27 @@ github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXP github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo= github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M= github.com/prometheus/client_golang v1.11.0/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0= -github.com/prometheus/client_golang v1.12.1/go.mod h1:3Z9XVyYiZYEO+YQWt3RD2R3jrbd179Rt297l4aS6nDY= -github.com/prometheus/client_golang v1.14.0 h1:nJdhIvne2eSX/XRAFV9PcvFFRbrjbcTUj0VP62TMhnw= -github.com/prometheus/client_golang v1.14.0/go.mod h1:8vpkKitgIVNcqrRBWh1C4TIUQgYNtG/XQE4E/Zae36Y= +github.com/prometheus/client_golang v1.16.0 h1:yk/hx9hDbrGHovbci4BY+pRMfSuuat626eFsHb7tmT8= +github.com/prometheus/client_golang v1.16.0/go.mod h1:Zsulrv/L9oM40tJ7T815tM89lFEugiJ9HzIqaAx4LKc= github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/client_model v0.3.0 h1:UBgGFHqYdG/TPFD1B1ogZywDqEkwp3fBMvqdiQ7Xew4= -github.com/prometheus/client_model v0.3.0/go.mod h1:LDGWKZIo7rky3hgvBe+caln+Dr3dPggB5dvjtD7w9+w= +github.com/prometheus/client_model v0.4.0 h1:5lQXD3cAg1OXBf4Wq03gTrXHeaV0TQvGfUooCfx1yqY= +github.com/prometheus/client_model v0.4.0/go.mod h1:oMQmHW1/JoDwqLtg57MGgP/Fb1CJEYF2imWWhWtMkYU= github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= github.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo= github.com/prometheus/common v0.26.0/go.mod h1:M7rCNAaPfAosfx8veZJCuw84e35h3Cfd9VFqTh1DIvc= github.com/prometheus/common v0.28.0/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+M/gUGO4Hls= -github.com/prometheus/common v0.32.1/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+M/gUGO4Hls= -github.com/prometheus/common v0.37.0 h1:ccBbHCgIiT9uSoFY0vX8H3zsNR5eLt17/RQLUvn8pXE= -github.com/prometheus/common v0.37.0/go.mod h1:phzohg0JFMnBEFGxTDbfu3QyL5GI8gTQJFhYO5B3mfA= +github.com/prometheus/common v0.44.0 h1:+5BrQJwiBB9xsMygAB3TNvpQKOwlkc25LbISbrdOOfY= +github.com/prometheus/common v0.44.0/go.mod h1:ofAIvZbQ1e/nugmZGz4/qCb9Ap1VoSTIO7x0VV9VvuY= github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= github.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= -github.com/prometheus/procfs v0.7.3/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= -github.com/prometheus/procfs v0.8.0 h1:ODq8ZFEaYeCaZOJlZZdJA2AbQR98dSHSM1KW/You5mo= -github.com/prometheus/procfs v0.8.0/go.mod h1:z7EfXMXOkbkqb9IINtpCn86r/to3BnA0uaxHdg830/4= +github.com/prometheus/procfs v0.10.1 h1:kYK1Va/YMlutzCGazswoHKo//tZVlFpKYh+PymziUAg= +github.com/prometheus/procfs v0.10.1/go.mod h1:nwNm2aOCAYw8uTR/9bWRREkZFxAUcWzPHWJq+XBB/FM= +github.com/prometheus/prometheus v0.45.0 h1:O/uG+Nw4kNxx/jDPxmjsSDd+9Ohql6E7ZSY1x5x/0KI= github.com/prometheus/statsd_exporter v0.21.0 h1:hA05Q5RFeIjgwKIYEdFd59xu5Wwaznf33yKI+pyX6T8= github.com/prometheus/statsd_exporter v0.21.0/go.mod h1:rbT83sZq2V+p73lHhPZfMc3MLCHmSHelCh9hSGYNLTQ= github.com/rabbitmq/amqp091-go v1.1.0/go.mod h1:ogQDLSOACsLPsIq0NpbtiifNZi2YOz0VTJ0kHRghqbM= @@ -506,7 +486,9 @@ github.com/rcrowley/go-metrics v0.0.0-20181016184325-3113b8401b8a/go.mod h1:bCqn github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4= github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= -github.com/rogpeppe/go-internal v1.9.0 h1:73kH8U+JUqXU8lRuOHeVHaa/SZPifC7BkcraZVejAe8= +github.com/rogpeppe/go-internal v1.10.0 h1:TMyTOH3F/DB16zRVcYyreMH6GnZZrwQVAoYjRBZyWFQ= +github.com/rs/dnscache v0.0.0-20211102005908-e0241e321417 h1:Lt9DzQALzHoDwMBGJ6v8ObDPR0dzr2a6sXTB1Fq7IHs= +github.com/rs/dnscache v0.0.0-20211102005908-e0241e321417/go.mod h1:qe5TWALJ8/a1Lqznoc5BDHpYX/8HU60Hm2AwRmqzxqA= github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/russross/blackfriday/v2 v2.1.0 h1:JIOH55/0cWyOuilr9/qlrm0BSXldqnqwMsf35Ld67mk= github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= @@ -523,8 +505,7 @@ 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/stoewer/go-strcase v1.2.0/go.mod h1:IBiWB2sKIp3wVVQ3Y035++gc+knqhUQag1KpM8ahLw8= 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/streadway/quantile v0.0.0-20220407130108-4246515d968d h1:X4+kt6zM/OVO6gbJdAfJR60MGPsqCzbtXNnjoGqdfAs= 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= github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= @@ -539,11 +520,10 @@ github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/ github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= github.com/stretchr/testify v1.8.1 h1:w7B6lhMri9wdJUVmEZPGGhZzrYTPvgJArz7wNPgYKsk= github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= -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 v12.8.4 h1:UQ7tG7WkDorKj0wjx78Z4/vsMBP8RJQMGJqRVrkvngg= -github.com/tsenart/vegeta/v12 v12.8.4/go.mod h1:ZiJtwLn/9M4fTPdMY7bdbIeyNeFVE8/AHbWFqCsUuho= +github.com/tsenart/vegeta/v12 v12.11.0 h1:f6V4xW6KMc5BLAWPzEu9l6Vclif44AW4IxPC7TSZwDM= +github.com/tsenart/vegeta/v12 v12.11.0/go.mod h1:YzY1ucY/V7QyR5ZVRqSMUkyuwgyqtXWQuEa2lVPzUeU= github.com/urfave/cli v1.22.4/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= github.com/urfave/cli/v2 v2.3.0/go.mod h1:LJmUH05zAU44vOAcrfzZQKsZbVcdbOG8rtL3/XcUArI= github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc= @@ -561,7 +541,6 @@ github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9de github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= @@ -578,19 +557,17 @@ go.uber.org/atomic v1.9.0 h1:ECmE8Bn/WFTYwEW/bpKD3M8VtR/zQVbavAoalC1PYyE= go.uber.org/atomic v1.9.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= go.uber.org/automaxprocs v1.4.0 h1:CpDZl6aOlLhReez+8S3eEotD7Jx0Os++lemPlMULQP0= go.uber.org/automaxprocs v1.4.0/go.mod h1:/mTEdr7LvHhs0v7mjdxDreTz1OG5zdZGqgOnhWiR/+Q= -go.uber.org/goleak v1.1.11-0.20210813005559-691160354723/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ= go.uber.org/goleak v1.2.0 h1:xqgm/S+aQvhWFTtR0XK3Jvg7z8kGV8P4X14IzwN3Eqk= go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= go.uber.org/multierr v1.6.0 h1:y6IPFStTAIT5Ytl7/XYmHvzXQ7S3g/IeZW9hyZ5thw4= go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU= go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= -go.uber.org/zap v1.19.1 h1:ue41HOKd1vGURxrmeKIgELGb3jPW9DMUDGtsinblHwI= -go.uber.org/zap v1.19.1/go.mod h1:j3DNczoxDZroyBnOT1L/Q79cfUMGZxlv/9dzN7SM1rI= +go.uber.org/zap v1.24.0 h1:FiJd5l1UOLj0wCgbSE0rwwXHzEdAZS6hiiSnxJN/D60= +go.uber.org/zap v1.24.0/go.mod h1:2kMP+WWQ8aoFoedH3T2sq6iJ2yDWpHbP0f6MQbS9Gkg= golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190829043050-9756ffdc2472/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200820211705-5c72a883971a/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= @@ -613,8 +590,8 @@ 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/exp v0.0.0-20230713183714-613f0c0eb8a1 h1:MGwJjxBy0HJshjDNfLsYO8xppfqWlA5ZT9OhtUUhTNw= 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= golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= @@ -635,10 +612,9 @@ golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzB golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= -golang.org/x/mod v0.9.0 h1:KENHtAZL2y3NLMYZeHY9DW8HW8V+kQyJsY/V9JlKvCs= -golang.org/x/mod v0.9.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= +golang.org/x/mod v0.12.0 h1:rmsUpXtvNzj340zd98LZ4KntptpfRHwpFOHG188oHXc= +golang.org/x/mod v0.12.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -654,7 +630,6 @@ golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLL golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/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-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= @@ -681,8 +656,6 @@ golang.org/x/net v0.0.0-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qx golang.org/x/net v0.0.0-20210805182204-aaa1db679c0d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20210917221730-978cfadd31cf/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= golang.org/x/net v0.12.0 h1:cfawfvKITfUsFCeJIHJrbSxpeu/E81khclypR0GVT50= golang.org/x/net v0.12.0/go.mod h1:zEVYFnQC7m/vmpQFELhcD1EWkZlX69l4oqgmer6hfKA= @@ -692,7 +665,6 @@ golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4Iltr golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20220223155221-ee480838109b/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= golang.org/x/oauth2 v0.8.0 h1:6dkIjl3j3LtZ/O3sTgZTMsLKSftL/B8Zgq4huOIIUu8= golang.org/x/oauth2 v0.8.0/go.mod h1:yr7u4HXZRm1R1kBWqr/xKNqewf0plRYoB7sla+BCIXE= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -705,10 +677,9 @@ golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.2.0 h1:PUR+T4wwASmuSTYdKjYHI5TD22Wy5ogLU5qZCOLxBrI= -golang.org/x/sync v0.2.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.3.0 h1:ftCYgMx6zT/asHUrPw8BLLscYtGznsLAnjq5RH9P66E= +golang.org/x/sync v0.3.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -753,15 +724,12 @@ golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210112080510-489259a85091/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210303074136-134d130e1a04/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210603081109-ebe580a85c40/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210819135213-f52c844e1c1c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220114195835-da31bd327af9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= @@ -805,7 +773,6 @@ golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgw golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20190907020128-2ca718005c18/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191113191852-77e3bb0ad9e7/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= @@ -837,10 +804,9 @@ golang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc golang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= golang.org/x/tools v0.0.0-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= -golang.org/x/tools v0.7.0 h1:W4OVu8VVOaIO0yzWMNdepAulS7YfoS3Zabrm8DOXXU4= -golang.org/x/tools v0.7.0/go.mod h1:4pg6aUX35JBAogB10C9AtvVL+qowtN4pT3CGSQex14s= +golang.org/x/tools v0.11.0 h1:EMCa6U9S2LtZXLAMoWiR/R8dAQFRqbAitmbJ2UKhoi8= +golang.org/x/tools v0.11.0/go.mod h1:anzJrxPjNtfgiYQYirP2CPGzGLxrH2u2QBhn6Bf3qY8= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= @@ -1007,16 +973,15 @@ k8s.io/kube-openapi v0.0.0-20221012153701-172d655c2280 h1:+70TFaan3hfJzs+7VK2o+O k8s.io/kube-openapi v0.0.0-20221012153701-172d655c2280/go.mod h1:+Axhij7bCpeqhklhUTe3xmOn6bWxolyZEeyaFpjGtl4= k8s.io/utils v0.0.0-20221108210102-8e77b1f39fe2 h1:GfD9OzL11kvZN5iArC6oTS7RTj7oJOIfnislxYlqTj8= k8s.io/utils v0.0.0-20221108210102-8e77b1f39fe2/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0= -knative.dev/caching v0.0.0-20230718155311-24ff72399d90 h1:FTywJXyLNTMA4XbWIXHh+4aHrLIIkSlGAl9yNTJhipY= -knative.dev/caching v0.0.0-20230718155311-24ff72399d90/go.mod h1:4IprjglzaLM1+/S+7OcMhxL3h15Uh0glFiV4NcJftD8= -knative.dev/hack v0.0.0-20230712131415-ddae80293c43 h1:3SE06uNfSFGm/5XS+0trbyCUpgsOaBeyhPQU8FPNFz8= -knative.dev/hack v0.0.0-20230712131415-ddae80293c43/go.mod h1:yk2OjGDsbEnQjfxdm0/HJKS2WqTLEFg/N6nUs6Rqx3Q= -knative.dev/networking v0.0.0-20230718160410-75dcd54d9510 h1:eNbWjEkbtGjCqK5TB4S0CjSSDd4PvyXm+w7bM9/zce4= -knative.dev/networking v0.0.0-20230718160410-75dcd54d9510/go.mod h1:Vngl91M++hqgoGNIjCii7MXnsEeN3kRbGC1aodhFqbk= -knative.dev/pkg v0.0.0-20230718152110-aef227e72ead h1:2dDzorpKuVZW3Qp7TbirMMq16FbId8f6bacQFX8jXLw= -knative.dev/pkg v0.0.0-20230718152110-aef227e72ead/go.mod h1:WmrwRV/P+hGHoMraAEfwg6ec+fBTf+Obu41v354Iabc= -pgregory.net/rapid v0.3.3 h1:jCjBsY4ln4Atz78QoBWxUEvAHaFyNDQg9+WU62aCn1U= -pgregory.net/rapid v0.3.3/go.mod h1:UYpPVyjFHzYBGHIxLFoupi8vwk6rXNzRY9OMvVxFIOU= +knative.dev/caching v0.0.0-20230802013852-e03e9f6594b3 h1:0OHEoC9jGIwPlJm+ClDDTdqqmMmwL6rQTyf/99UY2dI= +knative.dev/caching v0.0.0-20230802013852-e03e9f6594b3/go.mod h1:4IprjglzaLM1+/S+7OcMhxL3h15Uh0glFiV4NcJftD8= +knative.dev/hack v0.0.0-20230802014852-338500eed425 h1:/4R6Jbsfq3O7PTlVA4XcePxS/UAOZZ/qE4AdozSjy2s= +knative.dev/hack v0.0.0-20230802014852-338500eed425/go.mod h1:yk2OjGDsbEnQjfxdm0/HJKS2WqTLEFg/N6nUs6Rqx3Q= +knative.dev/networking v0.0.0-20230802091048-29da3ac7ef4d h1:v6vVLhZvUQXFaer8lpJvcE/YZGzkAjF7rXJNQMg9jnE= +knative.dev/networking v0.0.0-20230802091048-29da3ac7ef4d/go.mod h1:Vngl91M++hqgoGNIjCii7MXnsEeN3kRbGC1aodhFqbk= +knative.dev/pkg v0.0.0-20230802191948-8d3f95106327 h1:YvgaCUbXU7S9lJpm+Qh/z6LGiTSAWhyJLs5E/6dIx+8= +knative.dev/pkg v0.0.0-20230802191948-8d3f95106327/go.mod h1:iOH3bns9qjwY1/Ufq3/Vaqd+Lsk65b7yMFcWG3EriiI= +pgregory.net/rapid v1.0.0 h1:iQaM2w5PZ6xvt6x7hbd7tiDS+nk7YPp5uCaEba+T/F4= rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= diff --git a/third_party/VENDOR-LICENSE/github.com/benbjohnson/clock/LICENSE b/third_party/VENDOR-LICENSE/github.com/benbjohnson/clock/LICENSE new file mode 100644 index 000000000000..ce212cb1ceea --- /dev/null +++ b/third_party/VENDOR-LICENSE/github.com/benbjohnson/clock/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2014 Ben Johnson + +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/third_party/VENDOR-LICENSE/github.com/rs/dnscache/LICENSE b/third_party/VENDOR-LICENSE/github.com/rs/dnscache/LICENSE new file mode 100644 index 000000000000..71abfee39c7e --- /dev/null +++ b/third_party/VENDOR-LICENSE/github.com/rs/dnscache/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2018 Olivier Poitrey + +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/third_party/VENDOR-LICENSE/github.com/tsenart/vegeta/v12/lib/LICENSE b/third_party/VENDOR-LICENSE/github.com/tsenart/vegeta/v12/lib/LICENSE index 03ec4f5a824e..d396b44b381b 100644 --- a/third_party/VENDOR-LICENSE/github.com/tsenart/vegeta/v12/lib/LICENSE +++ b/third_party/VENDOR-LICENSE/github.com/tsenart/vegeta/v12/lib/LICENSE @@ -1,6 +1,6 @@ The MIT License (MIT) -Copyright (c) 2013-2020 Tomás Senart +Copyright (c) 2013-2023 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 diff --git a/vendor/github.com/benbjohnson/clock/LICENSE b/vendor/github.com/benbjohnson/clock/LICENSE new file mode 100644 index 000000000000..ce212cb1ceea --- /dev/null +++ b/vendor/github.com/benbjohnson/clock/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2014 Ben Johnson + +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/benbjohnson/clock/README.md b/vendor/github.com/benbjohnson/clock/README.md new file mode 100644 index 000000000000..ee37dfe1bda6 --- /dev/null +++ b/vendor/github.com/benbjohnson/clock/README.md @@ -0,0 +1,104 @@ +clock +===== + +Clock is a small library for mocking time in Go. It provides an interface +around the standard library's [`time`][time] package so that the application +can use the realtime clock while tests can use the mock clock. + +[time]: http://golang.org/pkg/time/ + + +## Usage + +### Realtime Clock + +Your application can maintain a `Clock` variable that will allow realtime and +mock clocks to be interchangeable. For example, if you had an `Application` type: + +```go +import "github.com/benbjohnson/clock" + +type Application struct { + Clock clock.Clock +} +``` + +You could initialize it to use the realtime clock like this: + +```go +var app Application +app.Clock = clock.New() +... +``` + +Then all timers and time-related functionality should be performed from the +`Clock` variable. + + +### Mocking time + +In your tests, you will want to use a `Mock` clock: + +```go +import ( + "testing" + + "github.com/benbjohnson/clock" +) + +func TestApplication_DoSomething(t *testing.T) { + mock := clock.NewMock() + app := Application{Clock: mock} + ... +} +``` + +Now that you've initialized your application to use the mock clock, you can +adjust the time programmatically. The mock clock always starts from the Unix +epoch (midnight UTC on Jan 1, 1970). + + +### Controlling time + +The mock clock provides the same functions that the standard library's `time` +package provides. For example, to find the current time, you use the `Now()` +function: + +```go +mock := clock.NewMock() + +// Find the current time. +mock.Now().UTC() // 1970-01-01 00:00:00 +0000 UTC + +// Move the clock forward. +mock.Add(2 * time.Hour) + +// Check the time again. It's 2 hours later! +mock.Now().UTC() // 1970-01-01 02:00:00 +0000 UTC +``` + +Timers and Tickers are also controlled by this same mock clock. They will only +execute when the clock is moved forward: + +```go +mock := clock.NewMock() +count := 0 + +// Kick off a timer to increment every 1 mock second. +go func() { + ticker := clock.Ticker(1 * time.Second) + for { + <-ticker.C + count++ + } +}() +runtime.Gosched() + +// Move the clock forward 10 seconds. +mock.Add(10 * time.Second) + +// This prints 10. +fmt.Println(count) +``` + + diff --git a/vendor/github.com/benbjohnson/clock/clock.go b/vendor/github.com/benbjohnson/clock/clock.go new file mode 100644 index 000000000000..6a4edb2e8497 --- /dev/null +++ b/vendor/github.com/benbjohnson/clock/clock.go @@ -0,0 +1,340 @@ +package clock + +import ( + "sort" + "sync" + "time" +) + +// Clock represents an interface to the functions in the standard library time +// package. Two implementations are available in the clock package. The first +// is a real-time clock which simply wraps the time package's functions. The +// second is a mock clock which will only change when +// programmatically adjusted. +type Clock interface { + After(d time.Duration) <-chan time.Time + AfterFunc(d time.Duration, f func()) *Timer + Now() time.Time + Since(t time.Time) time.Duration + Sleep(d time.Duration) + Tick(d time.Duration) <-chan time.Time + Ticker(d time.Duration) *Ticker + Timer(d time.Duration) *Timer +} + +// New returns an instance of a real-time clock. +func New() Clock { + return &clock{} +} + +// clock implements a real-time clock by simply wrapping the time package functions. +type clock struct{} + +func (c *clock) After(d time.Duration) <-chan time.Time { return time.After(d) } + +func (c *clock) AfterFunc(d time.Duration, f func()) *Timer { + return &Timer{timer: time.AfterFunc(d, f)} +} + +func (c *clock) Now() time.Time { return time.Now() } + +func (c *clock) Since(t time.Time) time.Duration { return time.Since(t) } + +func (c *clock) Sleep(d time.Duration) { time.Sleep(d) } + +func (c *clock) Tick(d time.Duration) <-chan time.Time { return time.Tick(d) } + +func (c *clock) Ticker(d time.Duration) *Ticker { + t := time.NewTicker(d) + return &Ticker{C: t.C, ticker: t} +} + +func (c *clock) Timer(d time.Duration) *Timer { + t := time.NewTimer(d) + return &Timer{C: t.C, timer: t} +} + +// Mock represents a mock clock that only moves forward programmatically. +// It can be preferable to a real-time clock when testing time-based functionality. +type Mock struct { + mu sync.Mutex + now time.Time // current time + timers clockTimers // tickers & timers +} + +// NewMock returns an instance of a mock clock. +// The current time of the mock clock on initialization is the Unix epoch. +func NewMock() *Mock { + return &Mock{now: time.Unix(0, 0)} +} + +// Add moves the current time of the mock clock forward by the specified duration. +// This should only be called from a single goroutine at a time. +func (m *Mock) Add(d time.Duration) { + // Calculate the final current time. + t := m.now.Add(d) + + // Continue to execute timers until there are no more before the new time. + for { + if !m.runNextTimer(t) { + break + } + } + + // Ensure that we end with the new time. + m.mu.Lock() + m.now = t + m.mu.Unlock() + + // Give a small buffer to make sure that other goroutines get handled. + gosched() +} + +// Set sets the current time of the mock clock to a specific one. +// This should only be called from a single goroutine at a time. +func (m *Mock) Set(t time.Time) { + // Continue to execute timers until there are no more before the new time. + for { + if !m.runNextTimer(t) { + break + } + } + + // Ensure that we end with the new time. + m.mu.Lock() + m.now = t + m.mu.Unlock() + + // Give a small buffer to make sure that other goroutines get handled. + gosched() +} + +// runNextTimer executes the next timer in chronological order and moves the +// current time to the timer's next tick time. The next time is not executed if +// its next time is after the max time. Returns true if a timer was executed. +func (m *Mock) runNextTimer(max time.Time) bool { + m.mu.Lock() + + // Sort timers by time. + sort.Sort(m.timers) + + // If we have no more timers then exit. + if len(m.timers) == 0 { + m.mu.Unlock() + return false + } + + // Retrieve next timer. Exit if next tick is after new time. + t := m.timers[0] + if t.Next().After(max) { + m.mu.Unlock() + return false + } + + // Move "now" forward and unlock clock. + m.now = t.Next() + m.mu.Unlock() + + // Execute timer. + t.Tick(m.now) + return true +} + +// After waits for the duration to elapse and then sends the current time on the returned channel. +func (m *Mock) After(d time.Duration) <-chan time.Time { + return m.Timer(d).C +} + +// AfterFunc waits for the duration to elapse and then executes a function. +// A Timer is returned that can be stopped. +func (m *Mock) AfterFunc(d time.Duration, f func()) *Timer { + t := m.Timer(d) + t.C = nil + t.fn = f + return t +} + +// Now returns the current wall time on the mock clock. +func (m *Mock) Now() time.Time { + m.mu.Lock() + defer m.mu.Unlock() + return m.now +} + +// Since returns time since the mock clock's wall time. +func (m *Mock) Since(t time.Time) time.Duration { + return m.Now().Sub(t) +} + +// Sleep pauses the goroutine for the given duration on the mock clock. +// The clock must be moved forward in a separate goroutine. +func (m *Mock) Sleep(d time.Duration) { + <-m.After(d) +} + +// Tick is a convenience function for Ticker(). +// It will return a ticker channel that cannot be stopped. +func (m *Mock) Tick(d time.Duration) <-chan time.Time { + return m.Ticker(d).C +} + +// Ticker creates a new instance of Ticker. +func (m *Mock) Ticker(d time.Duration) *Ticker { + m.mu.Lock() + defer m.mu.Unlock() + ch := make(chan time.Time, 1) + t := &Ticker{ + C: ch, + c: ch, + mock: m, + d: d, + next: m.now.Add(d), + } + m.timers = append(m.timers, (*internalTicker)(t)) + return t +} + +// Timer creates a new instance of Timer. +func (m *Mock) Timer(d time.Duration) *Timer { + m.mu.Lock() + defer m.mu.Unlock() + ch := make(chan time.Time, 1) + t := &Timer{ + C: ch, + c: ch, + mock: m, + next: m.now.Add(d), + stopped: false, + } + m.timers = append(m.timers, (*internalTimer)(t)) + return t +} + +func (m *Mock) removeClockTimer(t clockTimer) { + for i, timer := range m.timers { + if timer == t { + copy(m.timers[i:], m.timers[i+1:]) + m.timers[len(m.timers)-1] = nil + m.timers = m.timers[:len(m.timers)-1] + break + } + } + sort.Sort(m.timers) +} + +// clockTimer represents an object with an associated start time. +type clockTimer interface { + Next() time.Time + Tick(time.Time) +} + +// clockTimers represents a list of sortable timers. +type clockTimers []clockTimer + +func (a clockTimers) Len() int { return len(a) } +func (a clockTimers) Swap(i, j int) { a[i], a[j] = a[j], a[i] } +func (a clockTimers) Less(i, j int) bool { return a[i].Next().Before(a[j].Next()) } + +// Timer represents a single event. +// The current time will be sent on C, unless the timer was created by AfterFunc. +type Timer struct { + C <-chan time.Time + c chan time.Time + timer *time.Timer // realtime impl, if set + next time.Time // next tick time + mock *Mock // mock clock, if set + fn func() // AfterFunc function, if set + stopped bool // True if stopped, false if running +} + +// Stop turns off the ticker. +func (t *Timer) Stop() bool { + if t.timer != nil { + return t.timer.Stop() + } + + t.mock.mu.Lock() + registered := !t.stopped + t.mock.removeClockTimer((*internalTimer)(t)) + t.stopped = true + t.mock.mu.Unlock() + return registered +} + +// Reset changes the expiry time of the timer +func (t *Timer) Reset(d time.Duration) bool { + if t.timer != nil { + return t.timer.Reset(d) + } + + t.mock.mu.Lock() + t.next = t.mock.now.Add(d) + defer t.mock.mu.Unlock() + + registered := !t.stopped + if t.stopped { + t.mock.timers = append(t.mock.timers, (*internalTimer)(t)) + } + + t.stopped = false + return registered +} + +type internalTimer Timer + +func (t *internalTimer) Next() time.Time { return t.next } +func (t *internalTimer) Tick(now time.Time) { + t.mock.mu.Lock() + if t.fn != nil { + t.fn() + } else { + t.c <- now + } + t.mock.removeClockTimer((*internalTimer)(t)) + t.stopped = true + t.mock.mu.Unlock() + gosched() +} + +// Ticker holds a channel that receives "ticks" at regular intervals. +type Ticker struct { + C <-chan time.Time + c chan time.Time + ticker *time.Ticker // realtime impl, if set + next time.Time // next tick time + mock *Mock // mock clock, if set + d time.Duration // time between ticks +} + +// Stop turns off the ticker. +func (t *Ticker) Stop() { + if t.ticker != nil { + t.ticker.Stop() + } else { + t.mock.mu.Lock() + t.mock.removeClockTimer((*internalTicker)(t)) + t.mock.mu.Unlock() + } +} + +// Reset resets the ticker to a new duration. +func (t *Ticker) Reset(dur time.Duration) { + if t.ticker != nil { + t.ticker.Reset(dur) + } +} + +type internalTicker Ticker + +func (t *internalTicker) Next() time.Time { return t.next } +func (t *internalTicker) Tick(now time.Time) { + select { + case t.c <- now: + default: + } + t.next = now.Add(t.d) + gosched() +} + +// Sleep momentarily so that other goroutines can process. +func gosched() { time.Sleep(1 * time.Millisecond) } diff --git a/vendor/github.com/c2h5oh/datasize/README.md b/vendor/github.com/c2h5oh/datasize/README.md index ac0cf8586e9f..f6e828587f00 100644 --- a/vendor/github.com/c2h5oh/datasize/README.md +++ b/vendor/github.com/c2h5oh/datasize/README.md @@ -19,7 +19,7 @@ Just like `time` package provides `time.Second`, `time.Day` constants `datasize` Just like `time` package provides `duration.Nanoseconds() uint64 `, `duration.Hours() float64` helpers `datasize` has. * `ByteSize.Bytes() uint64` -* `ByteSize.Kilobytes() float4` +* `ByteSize.Kilobytes() float64` * `ByteSize.Megabytes() float64` * `ByteSize.Gigabytes() float64` * `ByteSize.Terabytes() float64` diff --git a/vendor/github.com/c2h5oh/datasize/datasize.go b/vendor/github.com/c2h5oh/datasize/datasize.go index 675478816249..2ce762751c08 100644 --- a/vendor/github.com/c2h5oh/datasize/datasize.go +++ b/vendor/github.com/c2h5oh/datasize/datasize.go @@ -215,3 +215,25 @@ BitsError: *b = 0 return &strconv.NumError{fnUnmarshalText, string(t0), ErrBits} } + +func Parse(t []byte) (ByteSize, error) { + var v ByteSize + err := v.UnmarshalText(t) + return v, err +} + +func MustParse(t []byte) ByteSize { + v, err := Parse(t) + if err != nil { + panic(err) + } + return v +} + +func ParseString(s string) (ByteSize, error) { + return Parse([]byte(s)) +} + +func MustParseString(s string) ByteSize { + return MustParse([]byte(s)) +} diff --git a/vendor/github.com/go-kit/log/README.md b/vendor/github.com/go-kit/log/README.md index a0931951df8d..8067794657cb 100644 --- a/vendor/github.com/go-kit/log/README.md +++ b/vendor/github.com/go-kit/log/README.md @@ -1,5 +1,10 @@ # package log +[![Go Reference](https://pkg.go.dev/badge/github.com/go-kit/log.svg)](https://pkg.go.dev/github.com/go-kit/log) +[![Go Report Card](https://goreportcard.com/badge/go-kit/log)](https://goreportcard.com/report/go-kit/log) +[![GitHub Actions](https://github.com/go-kit/log/actions/workflows/test.yml/badge.svg)](https://github.com/go-kit/log/actions/workflows/test.yml) +[![Coverage Status](https://coveralls.io/repos/github/go-kit/log/badge.svg?branch=main)](https://coveralls.io/github/go-kit/log?branch=main) + `package log` provides a minimal interface for structured logging in services. It may be wrapped to encode conventions, enforce type-safety, provide leveled logging, and so on. It can be used for both typical application log events, diff --git a/vendor/github.com/go-kit/log/json_logger.go b/vendor/github.com/go-kit/log/json_logger.go index 0cedbf82478e..d0faed4f0981 100644 --- a/vendor/github.com/go-kit/log/json_logger.go +++ b/vendor/github.com/go-kit/log/json_logger.go @@ -68,7 +68,7 @@ func safeString(str fmt.Stringer) (s string) { if v := reflect.ValueOf(str); v.Kind() == reflect.Ptr && v.IsNil() { s = "NULL" } else { - panic(panicVal) + s = fmt.Sprintf("PANIC in String method: %v", panicVal) } } }() @@ -82,7 +82,7 @@ func safeError(err error) (s interface{}) { if v := reflect.ValueOf(err); v.Kind() == reflect.Ptr && v.IsNil() { s = nil } else { - panic(panicVal) + s = fmt.Sprintf("PANIC in Error method: %v", panicVal) } } }() diff --git a/vendor/github.com/go-kit/log/level/doc.go b/vendor/github.com/go-kit/log/level/doc.go index 505d307b11b7..fd681dcf922a 100644 --- a/vendor/github.com/go-kit/log/level/doc.go +++ b/vendor/github.com/go-kit/log/level/doc.go @@ -7,6 +7,17 @@ // logger = level.NewFilter(logger, level.AllowInfo()) // <-- // logger = log.With(logger, "ts", log.DefaultTimestampUTC) // +// It's also possible to configure log level from a string. For instance from +// a flag, environment variable or configuration file. +// +// fs := flag.NewFlagSet("myprogram") +// lvl := fs.String("log", "info", "debug, info, warn, error") +// +// var logger log.Logger +// logger = log.NewLogfmtLogger(os.Stderr) +// logger = level.NewFilter(logger, level.Allow(level.ParseDefault(*lvl, level.InfoValue()))) // <-- +// logger = log.With(logger, "ts", log.DefaultTimestampUTC) +// // Then, at the callsites, use one of the level.Debug, Info, Warn, or Error // helper methods to emit leveled log events. // diff --git a/vendor/github.com/go-kit/log/level/level.go b/vendor/github.com/go-kit/log/level/level.go index c94756c6bea0..c641d9855243 100644 --- a/vendor/github.com/go-kit/log/level/level.go +++ b/vendor/github.com/go-kit/log/level/level.go @@ -1,6 +1,14 @@ package level -import "github.com/go-kit/log" +import ( + "errors" + "strings" + + "github.com/go-kit/log" +) + +// ErrInvalidLevelString is returned whenever an invalid string is passed to Parse. +var ErrInvalidLevelString = errors.New("invalid level string") // Error returns a logger that includes a Key/ErrorValue pair. func Error(logger log.Logger) log.Logger { @@ -66,6 +74,22 @@ func (l *logger) Log(keyvals ...interface{}) error { // Option sets a parameter for the leveled logger. type Option func(*logger) +// Allow the provided log level to pass. +func Allow(v Value) Option { + switch v { + case debugValue: + return AllowDebug() + case infoValue: + return AllowInfo() + case warnValue: + return AllowWarn() + case errorValue: + return AllowError() + default: + return AllowNone() + } +} + // AllowAll is an alias for AllowDebug. func AllowAll() Option { return AllowDebug() @@ -100,6 +124,33 @@ func allowed(allowed level) Option { return func(l *logger) { l.allowed = allowed } } +// Parse a string to its corresponding level value. Valid strings are "debug", +// "info", "warn", and "error". Strings are normalized via strings.TrimSpace and +// strings.ToLower. +func Parse(level string) (Value, error) { + switch strings.TrimSpace(strings.ToLower(level)) { + case debugValue.name: + return debugValue, nil + case infoValue.name: + return infoValue, nil + case warnValue.name: + return warnValue, nil + case errorValue.name: + return errorValue, nil + default: + return nil, ErrInvalidLevelString + } +} + +// ParseDefault calls Parse and returns the default Value on error. +func ParseDefault(level string, def Value) Value { + v, err := Parse(level) + if err != nil { + return def + } + return v +} + // ErrNotAllowed sets the error to return from Log when it squelches a log // event disallowed by the configured Allow[Level] option. By default, // ErrNotAllowed is nil; in this case the log event is squelched with no diff --git a/vendor/github.com/go-kit/log/staticcheck.conf b/vendor/github.com/go-kit/log/staticcheck.conf new file mode 100644 index 000000000000..528438b97d21 --- /dev/null +++ b/vendor/github.com/go-kit/log/staticcheck.conf @@ -0,0 +1 @@ +checks = ["all"] diff --git a/vendor/github.com/gorilla/websocket/README.md b/vendor/github.com/gorilla/websocket/README.md index 19aa2e75c824..2517a28715fa 100644 --- a/vendor/github.com/gorilla/websocket/README.md +++ b/vendor/github.com/gorilla/websocket/README.md @@ -6,6 +6,13 @@ Gorilla WebSocket is a [Go](http://golang.org/) implementation of the [WebSocket](http://www.rfc-editor.org/rfc/rfc6455.txt) protocol. + +--- + +⚠️ **[The Gorilla WebSocket Package is looking for a new maintainer](https://github.com/gorilla/websocket/issues/370)** + +--- + ### Documentation * [API Reference](https://pkg.go.dev/github.com/gorilla/websocket?tab=doc) @@ -30,35 +37,3 @@ The Gorilla WebSocket package passes the server tests in the [Autobahn Test Suite](https://github.com/crossbario/autobahn-testsuite) using the application in the [examples/autobahn subdirectory](https://github.com/gorilla/websocket/tree/master/examples/autobahn). -### Gorilla WebSocket compared with other packages - - - - - - - - - - - - - - - - - - -
github.com/gorillagolang.org/x/net
RFC 6455 Features
Passes Autobahn Test SuiteYesNo
Receive fragmented messageYesNo, see note 1
Send close messageYesNo
Send pings and receive pongsYesNo
Get the type of a received data messageYesYes, see note 2
Other Features
Compression ExtensionsExperimentalNo
Read message using io.ReaderYesNo, see note 3
Write message using io.WriteCloserYesNo, see note 3
- -Notes: - -1. Large messages are fragmented in [Chrome's new WebSocket implementation](http://www.ietf.org/mail-archive/web/hybi/current/msg10503.html). -2. The application can get the type of a received data message by implementing - a [Codec marshal](http://godoc.org/golang.org/x/net/websocket#Codec.Marshal) - function. -3. The go.net io.Reader and io.Writer operate across WebSocket frame boundaries. - Read returns when the input buffer is full or a frame boundary is - encountered. Each call to Write sends a single frame message. The Gorilla - io.Reader and io.WriteCloser operate on a single WebSocket message. - diff --git a/vendor/github.com/gorilla/websocket/client.go b/vendor/github.com/gorilla/websocket/client.go index 962c06a391c2..2efd83555d37 100644 --- a/vendor/github.com/gorilla/websocket/client.go +++ b/vendor/github.com/gorilla/websocket/client.go @@ -48,15 +48,23 @@ func NewClient(netConn net.Conn, u *url.URL, requestHeader http.Header, readBufS } // A Dialer contains options for connecting to WebSocket server. +// +// It is safe to call Dialer's methods concurrently. type Dialer struct { // NetDial specifies the dial function for creating TCP connections. If // NetDial is nil, net.Dial is used. NetDial func(network, addr string) (net.Conn, error) // NetDialContext specifies the dial function for creating TCP connections. If - // NetDialContext is nil, net.DialContext is used. + // NetDialContext is nil, NetDial is used. NetDialContext func(ctx context.Context, network, addr string) (net.Conn, error) + // NetDialTLSContext specifies the dial function for creating TLS/TCP connections. If + // NetDialTLSContext is nil, NetDialContext is used. + // If NetDialTLSContext is set, Dial assumes the TLS handshake is done there and + // TLSClientConfig is ignored. + NetDialTLSContext func(ctx context.Context, network, addr string) (net.Conn, error) + // Proxy specifies a function to return a proxy for a given // Request. If the function returns a non-nil error, the // request is aborted with the provided error. @@ -65,6 +73,8 @@ type Dialer struct { // TLSClientConfig specifies the TLS configuration to use with tls.Client. // If nil, the default configuration is used. + // If either NetDialTLS or NetDialTLSContext are set, Dial assumes the TLS handshake + // is done there and TLSClientConfig is ignored. TLSClientConfig *tls.Config // HandshakeTimeout specifies the duration for the handshake to complete. @@ -176,7 +186,7 @@ func (d *Dialer) DialContext(ctx context.Context, urlStr string, requestHeader h } req := &http.Request{ - Method: "GET", + Method: http.MethodGet, URL: u, Proto: "HTTP/1.1", ProtoMajor: 1, @@ -237,13 +247,32 @@ func (d *Dialer) DialContext(ctx context.Context, urlStr string, requestHeader h // Get network dial function. var netDial func(network, add string) (net.Conn, error) - if d.NetDialContext != nil { - netDial = func(network, addr string) (net.Conn, error) { - return d.NetDialContext(ctx, network, addr) + switch u.Scheme { + case "http": + if d.NetDialContext != nil { + netDial = func(network, addr string) (net.Conn, error) { + return d.NetDialContext(ctx, network, addr) + } + } else if d.NetDial != nil { + netDial = d.NetDial } - } else if d.NetDial != nil { - netDial = d.NetDial - } else { + case "https": + if d.NetDialTLSContext != nil { + netDial = func(network, addr string) (net.Conn, error) { + return d.NetDialTLSContext(ctx, network, addr) + } + } else if d.NetDialContext != nil { + netDial = func(network, addr string) (net.Conn, error) { + return d.NetDialContext(ctx, network, addr) + } + } else if d.NetDial != nil { + netDial = d.NetDial + } + default: + return nil, nil, errMalformedURL + } + + if netDial == nil { netDialer := &net.Dialer{} netDial = func(network, addr string) (net.Conn, error) { return netDialer.DialContext(ctx, network, addr) @@ -304,7 +333,9 @@ func (d *Dialer) DialContext(ctx context.Context, urlStr string, requestHeader h } }() - if u.Scheme == "https" { + if u.Scheme == "https" && d.NetDialTLSContext == nil { + // If NetDialTLSContext is set, assume that the TLS handshake has already been done + cfg := cloneTLSConfig(d.TLSClientConfig) if cfg.ServerName == "" { cfg.ServerName = hostNoPort @@ -312,11 +343,12 @@ func (d *Dialer) DialContext(ctx context.Context, urlStr string, requestHeader h tlsConn := tls.Client(netConn, cfg) netConn = tlsConn - var err error - if trace != nil { - err = doHandshakeWithTrace(trace, tlsConn, cfg) - } else { - err = doHandshake(tlsConn, cfg) + if trace != nil && trace.TLSHandshakeStart != nil { + trace.TLSHandshakeStart() + } + err := doHandshake(ctx, tlsConn, cfg) + if trace != nil && trace.TLSHandshakeDone != nil { + trace.TLSHandshakeDone(tlsConn.ConnectionState(), err) } if err != nil { @@ -348,8 +380,8 @@ func (d *Dialer) DialContext(ctx context.Context, urlStr string, requestHeader h } if resp.StatusCode != 101 || - !strings.EqualFold(resp.Header.Get("Upgrade"), "websocket") || - !strings.EqualFold(resp.Header.Get("Connection"), "upgrade") || + !tokenListContainsValue(resp.Header, "Upgrade", "websocket") || + !tokenListContainsValue(resp.Header, "Connection", "upgrade") || resp.Header.Get("Sec-Websocket-Accept") != computeAcceptKey(challengeKey) { // Before closing the network connection on return from this // function, slurp up some of the response to aid application @@ -382,14 +414,9 @@ func (d *Dialer) DialContext(ctx context.Context, urlStr string, requestHeader h return conn, resp, nil } -func doHandshake(tlsConn *tls.Conn, cfg *tls.Config) error { - if err := tlsConn.Handshake(); err != nil { - return err - } - if !cfg.InsecureSkipVerify { - if err := tlsConn.VerifyHostname(cfg.ServerName); err != nil { - return err - } +func cloneTLSConfig(cfg *tls.Config) *tls.Config { + if cfg == nil { + return &tls.Config{} } - return nil + return cfg.Clone() } diff --git a/vendor/github.com/gorilla/websocket/client_clone.go b/vendor/github.com/gorilla/websocket/client_clone.go deleted file mode 100644 index 4f0d943723a9..000000000000 --- a/vendor/github.com/gorilla/websocket/client_clone.go +++ /dev/null @@ -1,16 +0,0 @@ -// Copyright 2013 The Gorilla WebSocket Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// +build go1.8 - -package websocket - -import "crypto/tls" - -func cloneTLSConfig(cfg *tls.Config) *tls.Config { - if cfg == nil { - return &tls.Config{} - } - return cfg.Clone() -} diff --git a/vendor/github.com/gorilla/websocket/client_clone_legacy.go b/vendor/github.com/gorilla/websocket/client_clone_legacy.go deleted file mode 100644 index babb007fb414..000000000000 --- a/vendor/github.com/gorilla/websocket/client_clone_legacy.go +++ /dev/null @@ -1,38 +0,0 @@ -// Copyright 2013 The Gorilla WebSocket Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// +build !go1.8 - -package websocket - -import "crypto/tls" - -// cloneTLSConfig clones all public fields except the fields -// SessionTicketsDisabled and SessionTicketKey. This avoids copying the -// sync.Mutex in the sync.Once and makes it safe to call cloneTLSConfig on a -// config in active use. -func cloneTLSConfig(cfg *tls.Config) *tls.Config { - if cfg == nil { - return &tls.Config{} - } - return &tls.Config{ - Rand: cfg.Rand, - Time: cfg.Time, - Certificates: cfg.Certificates, - NameToCertificate: cfg.NameToCertificate, - GetCertificate: cfg.GetCertificate, - RootCAs: cfg.RootCAs, - NextProtos: cfg.NextProtos, - ServerName: cfg.ServerName, - ClientAuth: cfg.ClientAuth, - ClientCAs: cfg.ClientCAs, - InsecureSkipVerify: cfg.InsecureSkipVerify, - CipherSuites: cfg.CipherSuites, - PreferServerCipherSuites: cfg.PreferServerCipherSuites, - ClientSessionCache: cfg.ClientSessionCache, - MinVersion: cfg.MinVersion, - MaxVersion: cfg.MaxVersion, - CurvePreferences: cfg.CurvePreferences, - } -} diff --git a/vendor/github.com/gorilla/websocket/conn.go b/vendor/github.com/gorilla/websocket/conn.go index ca46d2f793c2..331eebc85009 100644 --- a/vendor/github.com/gorilla/websocket/conn.go +++ b/vendor/github.com/gorilla/websocket/conn.go @@ -13,6 +13,7 @@ import ( "math/rand" "net" "strconv" + "strings" "sync" "time" "unicode/utf8" @@ -401,6 +402,12 @@ func (c *Conn) write(frameType int, deadline time.Time, buf0, buf1 []byte) error return nil } +func (c *Conn) writeBufs(bufs ...[]byte) error { + b := net.Buffers(bufs) + _, err := b.WriteTo(c.conn) + return err +} + // WriteControl writes a control message with the given deadline. The allowed // message types are CloseMessage, PingMessage and PongMessage. func (c *Conn) WriteControl(messageType int, data []byte, deadline time.Time) error { @@ -794,47 +801,69 @@ func (c *Conn) advanceFrame() (int, error) { } // 2. Read and parse first two bytes of frame header. + // To aid debugging, collect and report all errors in the first two bytes + // of the header. + + var errors []string p, err := c.read(2) if err != nil { return noFrame, err } - final := p[0]&finalBit != 0 frameType := int(p[0] & 0xf) + final := p[0]&finalBit != 0 + rsv1 := p[0]&rsv1Bit != 0 + rsv2 := p[0]&rsv2Bit != 0 + rsv3 := p[0]&rsv3Bit != 0 mask := p[1]&maskBit != 0 c.setReadRemaining(int64(p[1] & 0x7f)) c.readDecompress = false - if c.newDecompressionReader != nil && (p[0]&rsv1Bit) != 0 { - c.readDecompress = true - p[0] &^= rsv1Bit + if rsv1 { + if c.newDecompressionReader != nil { + c.readDecompress = true + } else { + errors = append(errors, "RSV1 set") + } + } + + if rsv2 { + errors = append(errors, "RSV2 set") } - if rsv := p[0] & (rsv1Bit | rsv2Bit | rsv3Bit); rsv != 0 { - return noFrame, c.handleProtocolError("unexpected reserved bits 0x" + strconv.FormatInt(int64(rsv), 16)) + if rsv3 { + errors = append(errors, "RSV3 set") } switch frameType { case CloseMessage, PingMessage, PongMessage: if c.readRemaining > maxControlFramePayloadSize { - return noFrame, c.handleProtocolError("control frame length > 125") + errors = append(errors, "len > 125 for control") } if !final { - return noFrame, c.handleProtocolError("control frame not final") + errors = append(errors, "FIN not set on control") } case TextMessage, BinaryMessage: if !c.readFinal { - return noFrame, c.handleProtocolError("message start before final message frame") + errors = append(errors, "data before FIN") } c.readFinal = final case continuationFrame: if c.readFinal { - return noFrame, c.handleProtocolError("continuation after final message frame") + errors = append(errors, "continuation after FIN") } c.readFinal = final default: - return noFrame, c.handleProtocolError("unknown opcode " + strconv.Itoa(frameType)) + errors = append(errors, "bad opcode "+strconv.Itoa(frameType)) + } + + if mask != c.isServer { + errors = append(errors, "bad MASK") + } + + if len(errors) > 0 { + return noFrame, c.handleProtocolError(strings.Join(errors, ", ")) } // 3. Read and parse frame length as per @@ -872,10 +901,6 @@ func (c *Conn) advanceFrame() (int, error) { // 4. Handle frame masking. - if mask != c.isServer { - return noFrame, c.handleProtocolError("incorrect mask flag") - } - if mask { c.readMaskPos = 0 p, err := c.read(len(c.readMaskKey)) @@ -935,7 +960,7 @@ func (c *Conn) advanceFrame() (int, error) { if len(payload) >= 2 { closeCode = int(binary.BigEndian.Uint16(payload)) if !isValidReceivedCloseCode(closeCode) { - return noFrame, c.handleProtocolError("invalid close code") + return noFrame, c.handleProtocolError("bad close code " + strconv.Itoa(closeCode)) } closeText = string(payload[2:]) if !utf8.ValidString(closeText) { @@ -952,7 +977,11 @@ func (c *Conn) advanceFrame() (int, error) { } func (c *Conn) handleProtocolError(message string) error { - c.WriteControl(CloseMessage, FormatCloseMessage(CloseProtocolError, message), time.Now().Add(writeWait)) + data := FormatCloseMessage(CloseProtocolError, message) + if len(data) > maxControlFramePayloadSize { + data = data[:maxControlFramePayloadSize] + } + c.WriteControl(CloseMessage, data, time.Now().Add(writeWait)) return errors.New("websocket: " + message) } diff --git a/vendor/github.com/gorilla/websocket/conn_write.go b/vendor/github.com/gorilla/websocket/conn_write.go deleted file mode 100644 index a509a21f87af..000000000000 --- a/vendor/github.com/gorilla/websocket/conn_write.go +++ /dev/null @@ -1,15 +0,0 @@ -// Copyright 2016 The Gorilla WebSocket Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// +build go1.8 - -package websocket - -import "net" - -func (c *Conn) writeBufs(bufs ...[]byte) error { - b := net.Buffers(bufs) - _, err := b.WriteTo(c.conn) - return err -} diff --git a/vendor/github.com/gorilla/websocket/conn_write_legacy.go b/vendor/github.com/gorilla/websocket/conn_write_legacy.go deleted file mode 100644 index 37edaff5a578..000000000000 --- a/vendor/github.com/gorilla/websocket/conn_write_legacy.go +++ /dev/null @@ -1,18 +0,0 @@ -// Copyright 2016 The Gorilla WebSocket Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// +build !go1.8 - -package websocket - -func (c *Conn) writeBufs(bufs ...[]byte) error { - for _, buf := range bufs { - if len(buf) > 0 { - if _, err := c.conn.Write(buf); err != nil { - return err - } - } - } - return nil -} diff --git a/vendor/github.com/gorilla/websocket/mask.go b/vendor/github.com/gorilla/websocket/mask.go index 577fce9efd72..d0742bf2a551 100644 --- a/vendor/github.com/gorilla/websocket/mask.go +++ b/vendor/github.com/gorilla/websocket/mask.go @@ -2,6 +2,7 @@ // this source code is governed by a BSD-style license that can be found in the // LICENSE file. +//go:build !appengine // +build !appengine package websocket diff --git a/vendor/github.com/gorilla/websocket/mask_safe.go b/vendor/github.com/gorilla/websocket/mask_safe.go index 2aac060e52e7..36250ca7c47e 100644 --- a/vendor/github.com/gorilla/websocket/mask_safe.go +++ b/vendor/github.com/gorilla/websocket/mask_safe.go @@ -2,6 +2,7 @@ // this source code is governed by a BSD-style license that can be found in the // LICENSE file. +//go:build appengine // +build appengine package websocket diff --git a/vendor/github.com/gorilla/websocket/proxy.go b/vendor/github.com/gorilla/websocket/proxy.go index e87a8c9f0c96..e0f466b72fbb 100644 --- a/vendor/github.com/gorilla/websocket/proxy.go +++ b/vendor/github.com/gorilla/websocket/proxy.go @@ -48,7 +48,7 @@ func (hpd *httpProxyDialer) Dial(network string, addr string) (net.Conn, error) } connectReq := &http.Request{ - Method: "CONNECT", + Method: http.MethodConnect, URL: &url.URL{Opaque: addr}, Host: addr, Header: connectHeader, diff --git a/vendor/github.com/gorilla/websocket/server.go b/vendor/github.com/gorilla/websocket/server.go index 887d558918c7..24d53b38abed 100644 --- a/vendor/github.com/gorilla/websocket/server.go +++ b/vendor/github.com/gorilla/websocket/server.go @@ -23,6 +23,8 @@ func (e HandshakeError) Error() string { return e.message } // Upgrader specifies parameters for upgrading an HTTP connection to a // WebSocket connection. +// +// It is safe to call Upgrader's methods concurrently. type Upgrader struct { // HandshakeTimeout specifies the duration for the handshake to complete. HandshakeTimeout time.Duration @@ -115,8 +117,8 @@ func (u *Upgrader) selectSubprotocol(r *http.Request, responseHeader http.Header // Upgrade upgrades the HTTP server connection to the WebSocket protocol. // // The responseHeader is included in the response to the client's upgrade -// request. Use the responseHeader to specify cookies (Set-Cookie) and the -// application negotiated subprotocol (Sec-WebSocket-Protocol). +// request. Use the responseHeader to specify cookies (Set-Cookie). To specify +// subprotocols supported by the server, set Upgrader.Subprotocols directly. // // If the upgrade fails, then Upgrade replies to the client with an HTTP error // response. @@ -131,7 +133,7 @@ func (u *Upgrader) Upgrade(w http.ResponseWriter, r *http.Request, responseHeade return u.returnError(w, r, http.StatusBadRequest, badHandshake+"'websocket' token not found in 'Upgrade' header") } - if r.Method != "GET" { + if r.Method != http.MethodGet { return u.returnError(w, r, http.StatusMethodNotAllowed, badHandshake+"request method is not GET") } diff --git a/vendor/github.com/gorilla/websocket/tls_handshake.go b/vendor/github.com/gorilla/websocket/tls_handshake.go new file mode 100644 index 000000000000..a62b68ccb11e --- /dev/null +++ b/vendor/github.com/gorilla/websocket/tls_handshake.go @@ -0,0 +1,21 @@ +//go:build go1.17 +// +build go1.17 + +package websocket + +import ( + "context" + "crypto/tls" +) + +func doHandshake(ctx context.Context, tlsConn *tls.Conn, cfg *tls.Config) error { + if err := tlsConn.HandshakeContext(ctx); err != nil { + return err + } + if !cfg.InsecureSkipVerify { + if err := tlsConn.VerifyHostname(cfg.ServerName); err != nil { + return err + } + } + return nil +} diff --git a/vendor/github.com/gorilla/websocket/tls_handshake_116.go b/vendor/github.com/gorilla/websocket/tls_handshake_116.go new file mode 100644 index 000000000000..e1b2b44f6e6c --- /dev/null +++ b/vendor/github.com/gorilla/websocket/tls_handshake_116.go @@ -0,0 +1,21 @@ +//go:build !go1.17 +// +build !go1.17 + +package websocket + +import ( + "context" + "crypto/tls" +) + +func doHandshake(ctx context.Context, tlsConn *tls.Conn, cfg *tls.Config) error { + if err := tlsConn.Handshake(); err != nil { + return err + } + if !cfg.InsecureSkipVerify { + if err := tlsConn.VerifyHostname(cfg.ServerName); err != nil { + return err + } + } + return nil +} diff --git a/vendor/github.com/gorilla/websocket/trace.go b/vendor/github.com/gorilla/websocket/trace.go deleted file mode 100644 index 834f122a00db..000000000000 --- a/vendor/github.com/gorilla/websocket/trace.go +++ /dev/null @@ -1,19 +0,0 @@ -// +build go1.8 - -package websocket - -import ( - "crypto/tls" - "net/http/httptrace" -) - -func doHandshakeWithTrace(trace *httptrace.ClientTrace, tlsConn *tls.Conn, cfg *tls.Config) error { - if trace.TLSHandshakeStart != nil { - trace.TLSHandshakeStart() - } - err := doHandshake(tlsConn, cfg) - if trace.TLSHandshakeDone != nil { - trace.TLSHandshakeDone(tlsConn.ConnectionState(), err) - } - return err -} diff --git a/vendor/github.com/gorilla/websocket/trace_17.go b/vendor/github.com/gorilla/websocket/trace_17.go deleted file mode 100644 index 77d05a0b5748..000000000000 --- a/vendor/github.com/gorilla/websocket/trace_17.go +++ /dev/null @@ -1,12 +0,0 @@ -// +build !go1.8 - -package websocket - -import ( - "crypto/tls" - "net/http/httptrace" -) - -func doHandshakeWithTrace(trace *httptrace.ClientTrace, tlsConn *tls.Conn, cfg *tls.Config) error { - return doHandshake(tlsConn, cfg) -} diff --git a/vendor/github.com/prometheus/client_golang/prometheus/counter.go b/vendor/github.com/prometheus/client_golang/prometheus/counter.go index a912b75a05b7..62de4dc59aae 100644 --- a/vendor/github.com/prometheus/client_golang/prometheus/counter.go +++ b/vendor/github.com/prometheus/client_golang/prometheus/counter.go @@ -59,6 +59,18 @@ type ExemplarAdder interface { // CounterOpts is an alias for Opts. See there for doc comments. type CounterOpts Opts +// CounterVecOpts bundles the options to create a CounterVec metric. +// It is mandatory to set CounterOpts, see there for mandatory fields. VariableLabels +// is optional and can safely be left to its default value. +type CounterVecOpts struct { + CounterOpts + + // VariableLabels are used to partition the metric vector by the given set + // of labels. Each label value will be constrained with the optional Contraint + // function, if provided. + VariableLabels ConstrainableLabels +} + // NewCounter creates a new Counter based on the provided CounterOpts. // // The returned implementation also implements ExemplarAdder. It is safe to @@ -174,16 +186,24 @@ type CounterVec struct { // NewCounterVec creates a new CounterVec based on the provided CounterOpts and // partitioned by the given label names. func NewCounterVec(opts CounterOpts, labelNames []string) *CounterVec { - desc := NewDesc( + return V2.NewCounterVec(CounterVecOpts{ + CounterOpts: opts, + VariableLabels: UnconstrainedLabels(labelNames), + }) +} + +// NewCounterVec creates a new CounterVec based on the provided CounterVecOpts. +func (v2) NewCounterVec(opts CounterVecOpts) *CounterVec { + desc := V2.NewDesc( BuildFQName(opts.Namespace, opts.Subsystem, opts.Name), opts.Help, - labelNames, + opts.VariableLabels, opts.ConstLabels, ) return &CounterVec{ MetricVec: NewMetricVec(desc, func(lvs ...string) Metric { if len(lvs) != len(desc.variableLabels) { - panic(makeInconsistentCardinalityError(desc.fqName, desc.variableLabels, lvs)) + panic(makeInconsistentCardinalityError(desc.fqName, desc.variableLabels.labelNames(), lvs)) } result := &counter{desc: desc, labelPairs: MakeLabelPairs(desc, lvs), now: time.Now} result.init(result) // Init self-collection. diff --git a/vendor/github.com/prometheus/client_golang/prometheus/desc.go b/vendor/github.com/prometheus/client_golang/prometheus/desc.go index 8bc5e44e2fc4..deedc2dfbe75 100644 --- a/vendor/github.com/prometheus/client_golang/prometheus/desc.go +++ b/vendor/github.com/prometheus/client_golang/prometheus/desc.go @@ -14,20 +14,16 @@ package prometheus import ( - "errors" "fmt" "sort" "strings" "github.com/cespare/xxhash/v2" - - "github.com/prometheus/client_golang/prometheus/internal" - - //nolint:staticcheck // Ignore SA1019. Need to keep deprecated package for compatibility. - "github.com/golang/protobuf/proto" + dto "github.com/prometheus/client_model/go" "github.com/prometheus/common/model" + "google.golang.org/protobuf/proto" - dto "github.com/prometheus/client_model/go" + "github.com/prometheus/client_golang/prometheus/internal" ) // Desc is the descriptor used by every Prometheus Metric. It is essentially @@ -54,9 +50,9 @@ type Desc struct { // constLabelPairs contains precalculated DTO label pairs based on // the constant labels. constLabelPairs []*dto.LabelPair - // variableLabels contains names of labels for which the metric - // maintains variable values. - variableLabels []string + // variableLabels contains names of labels and normalization function for + // which the metric maintains variable values. + variableLabels ConstrainedLabels // id is a hash of the values of the ConstLabels and fqName. This // must be unique among all registered descriptors and can therefore be // used as an identifier of the descriptor. @@ -80,10 +76,24 @@ type Desc struct { // For constLabels, the label values are constant. Therefore, they are fully // specified in the Desc. See the Collector example for a usage pattern. func NewDesc(fqName, help string, variableLabels []string, constLabels Labels) *Desc { + return V2.NewDesc(fqName, help, UnconstrainedLabels(variableLabels), constLabels) +} + +// NewDesc allocates and initializes a new Desc. Errors are recorded in the Desc +// and will be reported on registration time. variableLabels and constLabels can +// be nil if no such labels should be set. fqName must not be empty. +// +// variableLabels only contain the label names and normalization functions. Their +// label values are variable and therefore not part of the Desc. (They are managed +// within the Metric.) +// +// For constLabels, the label values are constant. Therefore, they are fully +// specified in the Desc. See the Collector example for a usage pattern. +func (v2) NewDesc(fqName, help string, variableLabels ConstrainableLabels, constLabels Labels) *Desc { d := &Desc{ fqName: fqName, help: help, - variableLabels: variableLabels, + variableLabels: variableLabels.constrainedLabels(), } if !model.IsValidMetricName(model.LabelValue(fqName)) { d.err = fmt.Errorf("%q is not a valid metric name", fqName) @@ -93,7 +103,7 @@ func NewDesc(fqName, help string, variableLabels []string, constLabels Labels) * // their sorted label names) plus the fqName (at position 0). labelValues := make([]string, 1, len(constLabels)+1) labelValues[0] = fqName - labelNames := make([]string, 0, len(constLabels)+len(variableLabels)) + labelNames := make([]string, 0, len(constLabels)+len(d.variableLabels)) labelNameSet := map[string]struct{}{} // First add only the const label names and sort them... for labelName := range constLabels { @@ -118,16 +128,16 @@ func NewDesc(fqName, help string, variableLabels []string, constLabels Labels) * // Now add the variable label names, but prefix them with something that // cannot be in a regular label name. That prevents matching the label // dimension with a different mix between preset and variable labels. - for _, labelName := range variableLabels { - if !checkLabelName(labelName) { - d.err = fmt.Errorf("%q is not a valid label name for metric %q", labelName, fqName) + for _, label := range d.variableLabels { + if !checkLabelName(label.Name) { + d.err = fmt.Errorf("%q is not a valid label name for metric %q", label.Name, fqName) return d } - labelNames = append(labelNames, "$"+labelName) - labelNameSet[labelName] = struct{}{} + labelNames = append(labelNames, "$"+label.Name) + labelNameSet[label.Name] = struct{}{} } if len(labelNames) != len(labelNameSet) { - d.err = errors.New("duplicate label names") + d.err = fmt.Errorf("duplicate label names in constant and variable labels for metric %q", fqName) return d } diff --git a/vendor/github.com/prometheus/client_golang/prometheus/doc.go b/vendor/github.com/prometheus/client_golang/prometheus/doc.go index 811072cbd54f..962608f02c65 100644 --- a/vendor/github.com/prometheus/client_golang/prometheus/doc.go +++ b/vendor/github.com/prometheus/client_golang/prometheus/doc.go @@ -37,35 +37,35 @@ // // type metrics struct { // cpuTemp prometheus.Gauge -// hdFailures *prometheus.CounterVec +// hdFailures *prometheus.CounterVec // } // // func NewMetrics(reg prometheus.Registerer) *metrics { -// m := &metrics{ -// cpuTemp: prometheus.NewGauge(prometheus.GaugeOpts{ -// Name: "cpu_temperature_celsius", -// Help: "Current temperature of the CPU.", -// }), -// hdFailures: prometheus.NewCounterVec( -// prometheus.CounterOpts{ -// Name: "hd_errors_total", -// Help: "Number of hard-disk errors.", -// }, -// []string{"device"}, -// ), -// } -// reg.MustRegister(m.cpuTemp) -// reg.MustRegister(m.hdFailures) -// return m +// m := &metrics{ +// cpuTemp: prometheus.NewGauge(prometheus.GaugeOpts{ +// Name: "cpu_temperature_celsius", +// Help: "Current temperature of the CPU.", +// }), +// hdFailures: prometheus.NewCounterVec( +// prometheus.CounterOpts{ +// Name: "hd_errors_total", +// Help: "Number of hard-disk errors.", +// }, +// []string{"device"}, +// ), +// } +// reg.MustRegister(m.cpuTemp) +// reg.MustRegister(m.hdFailures) +// return m // } // // func main() { -// // Create a non-global registry. -// reg := prometheus.NewRegistry() +// // Create a non-global registry. +// reg := prometheus.NewRegistry() // -// // Create new metrics and register them using the custom registry. -// m := NewMetrics(reg) -// // Set values for the new created metrics. +// // Create new metrics and register them using the custom registry. +// m := NewMetrics(reg) +// // Set values for the new created metrics. // m.cpuTemp.Set(65.3) // m.hdFailures.With(prometheus.Labels{"device":"/dev/sda"}).Inc() // diff --git a/vendor/github.com/prometheus/client_golang/prometheus/gauge.go b/vendor/github.com/prometheus/client_golang/prometheus/gauge.go index 21271a5bb462..f1ea6c76f756 100644 --- a/vendor/github.com/prometheus/client_golang/prometheus/gauge.go +++ b/vendor/github.com/prometheus/client_golang/prometheus/gauge.go @@ -55,6 +55,18 @@ type Gauge interface { // GaugeOpts is an alias for Opts. See there for doc comments. type GaugeOpts Opts +// GaugeVecOpts bundles the options to create a GaugeVec metric. +// It is mandatory to set GaugeOpts, see there for mandatory fields. VariableLabels +// is optional and can safely be left to its default value. +type GaugeVecOpts struct { + GaugeOpts + + // VariableLabels are used to partition the metric vector by the given set + // of labels. Each label value will be constrained with the optional Contraint + // function, if provided. + VariableLabels ConstrainableLabels +} + // NewGauge creates a new Gauge based on the provided GaugeOpts. // // The returned implementation is optimized for a fast Set method. If you have a @@ -138,16 +150,24 @@ type GaugeVec struct { // NewGaugeVec creates a new GaugeVec based on the provided GaugeOpts and // partitioned by the given label names. func NewGaugeVec(opts GaugeOpts, labelNames []string) *GaugeVec { - desc := NewDesc( + return V2.NewGaugeVec(GaugeVecOpts{ + GaugeOpts: opts, + VariableLabels: UnconstrainedLabels(labelNames), + }) +} + +// NewGaugeVec creates a new GaugeVec based on the provided GaugeVecOpts. +func (v2) NewGaugeVec(opts GaugeVecOpts) *GaugeVec { + desc := V2.NewDesc( BuildFQName(opts.Namespace, opts.Subsystem, opts.Name), opts.Help, - labelNames, + opts.VariableLabels, opts.ConstLabels, ) return &GaugeVec{ MetricVec: NewMetricVec(desc, func(lvs ...string) Metric { if len(lvs) != len(desc.variableLabels) { - panic(makeInconsistentCardinalityError(desc.fqName, desc.variableLabels, lvs)) + panic(makeInconsistentCardinalityError(desc.fqName, desc.variableLabels.labelNames(), lvs)) } result := &gauge{desc: desc, labelPairs: MakeLabelPairs(desc, lvs)} result.init(result) // Init self-collection. diff --git a/vendor/github.com/prometheus/client_golang/prometheus/go_collector_latest.go b/vendor/github.com/prometheus/client_golang/prometheus/go_collector_latest.go index 3a2d55e84b1e..2d8d9f64f430 100644 --- a/vendor/github.com/prometheus/client_golang/prometheus/go_collector_latest.go +++ b/vendor/github.com/prometheus/client_golang/prometheus/go_collector_latest.go @@ -23,11 +23,10 @@ import ( "strings" "sync" - //nolint:staticcheck // Ignore SA1019. Need to keep deprecated package for compatibility. - "github.com/golang/protobuf/proto" - dto "github.com/prometheus/client_model/go" - "github.com/prometheus/client_golang/prometheus/internal" + + dto "github.com/prometheus/client_model/go" + "google.golang.org/protobuf/proto" ) const ( diff --git a/vendor/github.com/prometheus/client_golang/prometheus/histogram.go b/vendor/github.com/prometheus/client_golang/prometheus/histogram.go index 4c873a01c3d3..8d818afe90d7 100644 --- a/vendor/github.com/prometheus/client_golang/prometheus/histogram.go +++ b/vendor/github.com/prometheus/client_golang/prometheus/histogram.go @@ -22,10 +22,9 @@ import ( "sync/atomic" "time" - //nolint:staticcheck // Ignore SA1019. Need to keep deprecated package for compatibility. - "github.com/golang/protobuf/proto" - dto "github.com/prometheus/client_model/go" + + "google.golang.org/protobuf/proto" ) // nativeHistogramBounds for the frac of observed values. Only relevant for @@ -402,7 +401,7 @@ type HistogramOpts struct { // Histogram by a Prometheus server with that feature enabled (requires // Prometheus v2.40+). Sparse buckets are exponential buckets covering // the whole float64 range (with the exception of the “zero” bucket, see - // SparseBucketsZeroThreshold below). From any one bucket to the next, + // NativeHistogramZeroThreshold below). From any one bucket to the next, // the width of the bucket grows by a constant // factor. NativeHistogramBucketFactor provides an upper bound for this // factor (exception see below). The smaller @@ -433,7 +432,7 @@ type HistogramOpts struct { // bucket. For best results, this should be close to a bucket // boundary. This is usually the case if picking a power of two. If // NativeHistogramZeroThreshold is left at zero, - // DefSparseBucketsZeroThreshold is used as the threshold. To configure + // DefNativeHistogramZeroThreshold is used as the threshold. To configure // a zero bucket with an actual threshold of zero (i.e. only // observations of precisely zero will go into the zero bucket), set // NativeHistogramZeroThreshold to the NativeHistogramZeroThresholdZero @@ -469,6 +468,18 @@ type HistogramOpts struct { NativeHistogramMaxZeroThreshold float64 } +// HistogramVecOpts bundles the options to create a HistogramVec metric. +// It is mandatory to set HistogramOpts, see there for mandatory fields. VariableLabels +// is optional and can safely be left to its default value. +type HistogramVecOpts struct { + HistogramOpts + + // VariableLabels are used to partition the metric vector by the given set + // of labels. Each label value will be constrained with the optional Contraint + // function, if provided. + VariableLabels ConstrainableLabels +} + // NewHistogram creates a new Histogram based on the provided HistogramOpts. It // panics if the buckets in HistogramOpts are not in strictly increasing order. // @@ -489,11 +500,11 @@ func NewHistogram(opts HistogramOpts) Histogram { func newHistogram(desc *Desc, opts HistogramOpts, labelValues ...string) Histogram { if len(desc.variableLabels) != len(labelValues) { - panic(makeInconsistentCardinalityError(desc.fqName, desc.variableLabels, labelValues)) + panic(makeInconsistentCardinalityError(desc.fqName, desc.variableLabels.labelNames(), labelValues)) } for _, n := range desc.variableLabels { - if n == bucketLabel { + if n.Name == bucketLabel { panic(errBucketLabelNotAllowed) } } @@ -544,16 +555,12 @@ func newHistogram(desc *Desc, opts HistogramOpts, labelValues ...string) Histogr } // Finally we know the final length of h.upperBounds and can make buckets // for both counts as well as exemplars: - h.counts[0] = &histogramCounts{ - buckets: make([]uint64, len(h.upperBounds)), - nativeHistogramZeroThresholdBits: math.Float64bits(h.nativeHistogramZeroThreshold), - nativeHistogramSchema: h.nativeHistogramSchema, - } - h.counts[1] = &histogramCounts{ - buckets: make([]uint64, len(h.upperBounds)), - nativeHistogramZeroThresholdBits: math.Float64bits(h.nativeHistogramZeroThreshold), - nativeHistogramSchema: h.nativeHistogramSchema, - } + h.counts[0] = &histogramCounts{buckets: make([]uint64, len(h.upperBounds))} + atomic.StoreUint64(&h.counts[0].nativeHistogramZeroThresholdBits, math.Float64bits(h.nativeHistogramZeroThreshold)) + atomic.StoreInt32(&h.counts[0].nativeHistogramSchema, h.nativeHistogramSchema) + h.counts[1] = &histogramCounts{buckets: make([]uint64, len(h.upperBounds))} + atomic.StoreUint64(&h.counts[1].nativeHistogramZeroThresholdBits, math.Float64bits(h.nativeHistogramZeroThreshold)) + atomic.StoreInt32(&h.counts[1].nativeHistogramSchema, h.nativeHistogramSchema) h.exemplars = make([]atomic.Value, len(h.upperBounds)+1) h.init(h) // Init self-collection. @@ -632,8 +639,8 @@ func (hc *histogramCounts) observe(v float64, bucket int, doSparse bool) { if frac == 0.5 { key-- } - div := 1 << -schema - key = (key + div - 1) / div + offset := (1 << -schema) - 1 + key = (key + offset) >> -schema } if isInf { key++ @@ -810,7 +817,7 @@ func (h *histogram) observe(v float64, bucket int) { } } -// limitSparsebuckets applies a strategy to limit the number of populated sparse +// limitBuckets applies a strategy to limit the number of populated sparse // buckets. It's generally best effort, and there are situations where the // number can go higher (if even the lowest resolution isn't enough to reduce // the number sufficiently, or if the provided counts aren't fully updated yet @@ -1034,15 +1041,23 @@ type HistogramVec struct { // NewHistogramVec creates a new HistogramVec based on the provided HistogramOpts and // partitioned by the given label names. func NewHistogramVec(opts HistogramOpts, labelNames []string) *HistogramVec { - desc := NewDesc( + return V2.NewHistogramVec(HistogramVecOpts{ + HistogramOpts: opts, + VariableLabels: UnconstrainedLabels(labelNames), + }) +} + +// NewHistogramVec creates a new HistogramVec based on the provided HistogramVecOpts. +func (v2) NewHistogramVec(opts HistogramVecOpts) *HistogramVec { + desc := V2.NewDesc( BuildFQName(opts.Namespace, opts.Subsystem, opts.Name), opts.Help, - labelNames, + opts.VariableLabels, opts.ConstLabels, ) return &HistogramVec{ MetricVec: NewMetricVec(desc, func(lvs ...string) Metric { - return newHistogram(desc, opts, lvs...) + return newHistogram(desc, opts.HistogramOpts, lvs...) }), } } diff --git a/vendor/github.com/prometheus/client_golang/prometheus/labels.go b/vendor/github.com/prometheus/client_golang/prometheus/labels.go index c1b8fad36aeb..63ff8683ce52 100644 --- a/vendor/github.com/prometheus/client_golang/prometheus/labels.go +++ b/vendor/github.com/prometheus/client_golang/prometheus/labels.go @@ -32,6 +32,78 @@ import ( // create a Desc. type Labels map[string]string +// ConstrainedLabels represents a label name and its constrain function +// to normalize label values. This type is commonly used when constructing +// metric vector Collectors. +type ConstrainedLabel struct { + Name string + Constraint func(string) string +} + +func (cl ConstrainedLabel) Constrain(v string) string { + if cl.Constraint == nil { + return v + } + return cl.Constraint(v) +} + +// ConstrainableLabels is an interface that allows creating of labels that can +// be optionally constrained. +// +// prometheus.V2().NewCounterVec(CounterVecOpts{ +// CounterOpts: {...}, // Usual CounterOpts fields +// VariableLabels: []ConstrainedLabels{ +// {Name: "A"}, +// {Name: "B", Constraint: func(v string) string { ... }}, +// }, +// }) +type ConstrainableLabels interface { + constrainedLabels() ConstrainedLabels + labelNames() []string +} + +// ConstrainedLabels represents a collection of label name -> constrain function +// to normalize label values. This type is commonly used when constructing +// metric vector Collectors. +type ConstrainedLabels []ConstrainedLabel + +func (cls ConstrainedLabels) constrainedLabels() ConstrainedLabels { + return cls +} + +func (cls ConstrainedLabels) labelNames() []string { + names := make([]string, len(cls)) + for i, label := range cls { + names[i] = label.Name + } + return names +} + +// UnconstrainedLabels represents collection of label without any constraint on +// their value. Thus, it is simply a collection of label names. +// +// UnconstrainedLabels([]string{ "A", "B" }) +// +// is equivalent to +// +// ConstrainedLabels { +// { Name: "A" }, +// { Name: "B" }, +// } +type UnconstrainedLabels []string + +func (uls UnconstrainedLabels) constrainedLabels() ConstrainedLabels { + constrainedLabels := make([]ConstrainedLabel, len(uls)) + for i, l := range uls { + constrainedLabels[i] = ConstrainedLabel{Name: l} + } + return constrainedLabels +} + +func (uls UnconstrainedLabels) labelNames() []string { + return uls +} + // reservedLabelPrefix is a prefix which is not legal in user-supplied // label names. const reservedLabelPrefix = "__" diff --git a/vendor/github.com/prometheus/client_golang/prometheus/metric.go b/vendor/github.com/prometheus/client_golang/prometheus/metric.go index b5119c50410e..07bbc9d76871 100644 --- a/vendor/github.com/prometheus/client_golang/prometheus/metric.go +++ b/vendor/github.com/prometheus/client_golang/prometheus/metric.go @@ -20,11 +20,9 @@ import ( "strings" "time" - //nolint:staticcheck // Ignore SA1019. Need to keep deprecated package for compatibility. - "github.com/golang/protobuf/proto" - "github.com/prometheus/common/model" - dto "github.com/prometheus/client_model/go" + "github.com/prometheus/common/model" + "google.golang.org/protobuf/proto" ) var separatorByteSlice = []byte{model.SeparatorByte} // For convenient use with xxhash. diff --git a/vendor/github.com/prometheus/client_golang/prometheus/promhttp/http.go b/vendor/github.com/prometheus/client_golang/prometheus/promhttp/http.go index a4cc9810b072..09b8d2fbead0 100644 --- a/vendor/github.com/prometheus/client_golang/prometheus/promhttp/http.go +++ b/vendor/github.com/prometheus/client_golang/prometheus/promhttp/http.go @@ -37,6 +37,7 @@ import ( "fmt" "io" "net/http" + "strconv" "strings" "sync" "time" @@ -47,9 +48,10 @@ import ( ) const ( - contentTypeHeader = "Content-Type" - contentEncodingHeader = "Content-Encoding" - acceptEncodingHeader = "Accept-Encoding" + contentTypeHeader = "Content-Type" + contentEncodingHeader = "Content-Encoding" + acceptEncodingHeader = "Accept-Encoding" + processStartTimeHeader = "Process-Start-Time-Unix" ) var gzipPool = sync.Pool{ @@ -121,6 +123,9 @@ func HandlerForTransactional(reg prometheus.TransactionalGatherer, opts HandlerO } h := http.HandlerFunc(func(rsp http.ResponseWriter, req *http.Request) { + if !opts.ProcessStartTime.IsZero() { + rsp.Header().Set(processStartTimeHeader, strconv.FormatInt(opts.ProcessStartTime.Unix(), 10)) + } if inFlightSem != nil { select { case inFlightSem <- struct{}{}: // All good, carry on. @@ -366,6 +371,14 @@ type HandlerOpts struct { // (which changes the identity of the resulting series on the Prometheus // server). EnableOpenMetrics bool + // ProcessStartTime allows setting process start timevalue that will be exposed + // with "Process-Start-Time-Unix" response header along with the metrics + // payload. This allow callers to have efficient transformations to cumulative + // counters (e.g. OpenTelemetry) or generally _created timestamp estimation per + // scrape target. + // NOTE: This feature is experimental and not covered by OpenMetrics or Prometheus + // exposition format. + ProcessStartTime time.Time } // gzipAccepted returns whether the client will accept gzip-encoded content. diff --git a/vendor/github.com/prometheus/client_golang/prometheus/promhttp/instrument_client.go b/vendor/github.com/prometheus/client_golang/prometheus/promhttp/instrument_client.go index 21086781621f..d3482c40ca76 100644 --- a/vendor/github.com/prometheus/client_golang/prometheus/promhttp/instrument_client.go +++ b/vendor/github.com/prometheus/client_golang/prometheus/promhttp/instrument_client.go @@ -68,16 +68,17 @@ func InstrumentRoundTripperCounter(counter *prometheus.CounterVec, next http.Rou o.apply(rtOpts) } - code, method := checkLabels(counter) + // Curry the counter with dynamic labels before checking the remaining labels. + code, method := checkLabels(counter.MustCurryWith(rtOpts.emptyDynamicLabels())) return func(r *http.Request) (*http.Response, error) { resp, err := next.RoundTrip(r) if err == nil { - addWithExemplar( - counter.With(labels(code, method, r.Method, resp.StatusCode, rtOpts.extraMethods...)), - 1, - rtOpts.getExemplarFn(r.Context()), - ) + l := labels(code, method, r.Method, resp.StatusCode, rtOpts.extraMethods...) + for label, resolve := range rtOpts.extraLabelsFromCtx { + l[label] = resolve(resp.Request.Context()) + } + addWithExemplar(counter.With(l), 1, rtOpts.getExemplarFn(r.Context())) } return resp, err } @@ -110,17 +111,18 @@ func InstrumentRoundTripperDuration(obs prometheus.ObserverVec, next http.RoundT o.apply(rtOpts) } - code, method := checkLabels(obs) + // Curry the observer with dynamic labels before checking the remaining labels. + code, method := checkLabels(obs.MustCurryWith(rtOpts.emptyDynamicLabels())) return func(r *http.Request) (*http.Response, error) { start := time.Now() resp, err := next.RoundTrip(r) if err == nil { - observeWithExemplar( - obs.With(labels(code, method, r.Method, resp.StatusCode, rtOpts.extraMethods...)), - time.Since(start).Seconds(), - rtOpts.getExemplarFn(r.Context()), - ) + l := labels(code, method, r.Method, resp.StatusCode, rtOpts.extraMethods...) + for label, resolve := range rtOpts.extraLabelsFromCtx { + l[label] = resolve(resp.Request.Context()) + } + observeWithExemplar(obs.With(l), time.Since(start).Seconds(), rtOpts.getExemplarFn(r.Context())) } return resp, err } diff --git a/vendor/github.com/prometheus/client_golang/prometheus/promhttp/instrument_server.go b/vendor/github.com/prometheus/client_golang/prometheus/promhttp/instrument_server.go index cca67a78a90d..3793036ad09b 100644 --- a/vendor/github.com/prometheus/client_golang/prometheus/promhttp/instrument_server.go +++ b/vendor/github.com/prometheus/client_golang/prometheus/promhttp/instrument_server.go @@ -87,7 +87,8 @@ func InstrumentHandlerDuration(obs prometheus.ObserverVec, next http.Handler, op o.apply(hOpts) } - code, method := checkLabels(obs) + // Curry the observer with dynamic labels before checking the remaining labels. + code, method := checkLabels(obs.MustCurryWith(hOpts.emptyDynamicLabels())) if code { return func(w http.ResponseWriter, r *http.Request) { @@ -95,23 +96,22 @@ func InstrumentHandlerDuration(obs prometheus.ObserverVec, next http.Handler, op d := newDelegator(w, nil) next.ServeHTTP(d, r) - observeWithExemplar( - obs.With(labels(code, method, r.Method, d.Status(), hOpts.extraMethods...)), - time.Since(now).Seconds(), - hOpts.getExemplarFn(r.Context()), - ) + l := labels(code, method, r.Method, d.Status(), hOpts.extraMethods...) + for label, resolve := range hOpts.extraLabelsFromCtx { + l[label] = resolve(r.Context()) + } + observeWithExemplar(obs.With(l), time.Since(now).Seconds(), hOpts.getExemplarFn(r.Context())) } } return func(w http.ResponseWriter, r *http.Request) { now := time.Now() next.ServeHTTP(w, r) - - observeWithExemplar( - obs.With(labels(code, method, r.Method, 0, hOpts.extraMethods...)), - time.Since(now).Seconds(), - hOpts.getExemplarFn(r.Context()), - ) + l := labels(code, method, r.Method, 0, hOpts.extraMethods...) + for label, resolve := range hOpts.extraLabelsFromCtx { + l[label] = resolve(r.Context()) + } + observeWithExemplar(obs.With(l), time.Since(now).Seconds(), hOpts.getExemplarFn(r.Context())) } } @@ -138,28 +138,30 @@ func InstrumentHandlerCounter(counter *prometheus.CounterVec, next http.Handler, o.apply(hOpts) } - code, method := checkLabels(counter) + // Curry the counter with dynamic labels before checking the remaining labels. + code, method := checkLabels(counter.MustCurryWith(hOpts.emptyDynamicLabels())) if code { return func(w http.ResponseWriter, r *http.Request) { d := newDelegator(w, nil) next.ServeHTTP(d, r) - addWithExemplar( - counter.With(labels(code, method, r.Method, d.Status(), hOpts.extraMethods...)), - 1, - hOpts.getExemplarFn(r.Context()), - ) + l := labels(code, method, r.Method, d.Status(), hOpts.extraMethods...) + for label, resolve := range hOpts.extraLabelsFromCtx { + l[label] = resolve(r.Context()) + } + addWithExemplar(counter.With(l), 1, hOpts.getExemplarFn(r.Context())) } } return func(w http.ResponseWriter, r *http.Request) { next.ServeHTTP(w, r) - addWithExemplar( - counter.With(labels(code, method, r.Method, 0, hOpts.extraMethods...)), - 1, - hOpts.getExemplarFn(r.Context()), - ) + + l := labels(code, method, r.Method, 0, hOpts.extraMethods...) + for label, resolve := range hOpts.extraLabelsFromCtx { + l[label] = resolve(r.Context()) + } + addWithExemplar(counter.With(l), 1, hOpts.getExemplarFn(r.Context())) } } @@ -191,16 +193,17 @@ func InstrumentHandlerTimeToWriteHeader(obs prometheus.ObserverVec, next http.Ha o.apply(hOpts) } - code, method := checkLabels(obs) + // Curry the observer with dynamic labels before checking the remaining labels. + code, method := checkLabels(obs.MustCurryWith(hOpts.emptyDynamicLabels())) return func(w http.ResponseWriter, r *http.Request) { now := time.Now() d := newDelegator(w, func(status int) { - observeWithExemplar( - obs.With(labels(code, method, r.Method, status, hOpts.extraMethods...)), - time.Since(now).Seconds(), - hOpts.getExemplarFn(r.Context()), - ) + l := labels(code, method, r.Method, status, hOpts.extraMethods...) + for label, resolve := range hOpts.extraLabelsFromCtx { + l[label] = resolve(r.Context()) + } + observeWithExemplar(obs.With(l), time.Since(now).Seconds(), hOpts.getExemplarFn(r.Context())) }) next.ServeHTTP(d, r) } @@ -231,28 +234,32 @@ func InstrumentHandlerRequestSize(obs prometheus.ObserverVec, next http.Handler, o.apply(hOpts) } - code, method := checkLabels(obs) + // Curry the observer with dynamic labels before checking the remaining labels. + code, method := checkLabels(obs.MustCurryWith(hOpts.emptyDynamicLabels())) + if code { return func(w http.ResponseWriter, r *http.Request) { d := newDelegator(w, nil) next.ServeHTTP(d, r) size := computeApproximateRequestSize(r) - observeWithExemplar( - obs.With(labels(code, method, r.Method, d.Status(), hOpts.extraMethods...)), - float64(size), - hOpts.getExemplarFn(r.Context()), - ) + + l := labels(code, method, r.Method, d.Status(), hOpts.extraMethods...) + for label, resolve := range hOpts.extraLabelsFromCtx { + l[label] = resolve(r.Context()) + } + observeWithExemplar(obs.With(l), float64(size), hOpts.getExemplarFn(r.Context())) } } return func(w http.ResponseWriter, r *http.Request) { next.ServeHTTP(w, r) size := computeApproximateRequestSize(r) - observeWithExemplar( - obs.With(labels(code, method, r.Method, 0, hOpts.extraMethods...)), - float64(size), - hOpts.getExemplarFn(r.Context()), - ) + + l := labels(code, method, r.Method, 0, hOpts.extraMethods...) + for label, resolve := range hOpts.extraLabelsFromCtx { + l[label] = resolve(r.Context()) + } + observeWithExemplar(obs.With(l), float64(size), hOpts.getExemplarFn(r.Context())) } } @@ -281,16 +288,18 @@ func InstrumentHandlerResponseSize(obs prometheus.ObserverVec, next http.Handler o.apply(hOpts) } - code, method := checkLabels(obs) + // Curry the observer with dynamic labels before checking the remaining labels. + code, method := checkLabels(obs.MustCurryWith(hOpts.emptyDynamicLabels())) return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { d := newDelegator(w, nil) next.ServeHTTP(d, r) - observeWithExemplar( - obs.With(labels(code, method, r.Method, d.Status(), hOpts.extraMethods...)), - float64(d.Written()), - hOpts.getExemplarFn(r.Context()), - ) + + l := labels(code, method, r.Method, d.Status(), hOpts.extraMethods...) + for label, resolve := range hOpts.extraLabelsFromCtx { + l[label] = resolve(r.Context()) + } + observeWithExemplar(obs.With(l), float64(d.Written()), hOpts.getExemplarFn(r.Context())) }) } diff --git a/vendor/github.com/prometheus/client_golang/prometheus/promhttp/option.go b/vendor/github.com/prometheus/client_golang/prometheus/promhttp/option.go index c590d912c947..5d4383aa14a3 100644 --- a/vendor/github.com/prometheus/client_golang/prometheus/promhttp/option.go +++ b/vendor/github.com/prometheus/client_golang/prometheus/promhttp/option.go @@ -24,14 +24,32 @@ type Option interface { apply(*options) } +// LabelValueFromCtx are used to compute the label value from request context. +// Context can be filled with values from request through middleware. +type LabelValueFromCtx func(ctx context.Context) string + // options store options for both a handler or round tripper. type options struct { - extraMethods []string - getExemplarFn func(requestCtx context.Context) prometheus.Labels + extraMethods []string + getExemplarFn func(requestCtx context.Context) prometheus.Labels + extraLabelsFromCtx map[string]LabelValueFromCtx } func defaultOptions() *options { - return &options{getExemplarFn: func(ctx context.Context) prometheus.Labels { return nil }} + return &options{ + getExemplarFn: func(ctx context.Context) prometheus.Labels { return nil }, + extraLabelsFromCtx: map[string]LabelValueFromCtx{}, + } +} + +func (o *options) emptyDynamicLabels() prometheus.Labels { + labels := prometheus.Labels{} + + for label := range o.extraLabelsFromCtx { + labels[label] = "" + } + + return labels } type optionApplyFunc func(*options) @@ -48,11 +66,19 @@ func WithExtraMethods(methods ...string) Option { }) } -// WithExemplarFromContext adds allows to put a hook to all counter and histogram metrics. -// If the hook function returns non-nil labels, exemplars will be added for that request, otherwise metric -// will get instrumented without exemplar. +// WithExemplarFromContext allows to inject function that will get exemplar from context that will be put to counter and histogram metrics. +// If the function returns nil labels or the metric does not support exemplars, no exemplar will be added (noop), but +// metric will continue to observe/increment. func WithExemplarFromContext(getExemplarFn func(requestCtx context.Context) prometheus.Labels) Option { return optionApplyFunc(func(o *options) { o.getExemplarFn = getExemplarFn }) } + +// WithLabelFromCtx registers a label for dynamic resolution with access to context. +// See the example for ExampleInstrumentHandlerWithLabelResolver for example usage +func WithLabelFromCtx(name string, valueFn LabelValueFromCtx) Option { + return optionApplyFunc(func(o *options) { + o.extraLabelsFromCtx[name] = valueFn + }) +} diff --git a/vendor/github.com/prometheus/client_golang/prometheus/registry.go b/vendor/github.com/prometheus/client_golang/prometheus/registry.go index 09e34d307c97..44da9433beef 100644 --- a/vendor/github.com/prometheus/client_golang/prometheus/registry.go +++ b/vendor/github.com/prometheus/client_golang/prometheus/registry.go @@ -21,18 +21,17 @@ import ( "path/filepath" "runtime" "sort" + "strconv" "strings" "sync" "unicode/utf8" - "github.com/cespare/xxhash/v2" - //nolint:staticcheck // Ignore SA1019. Need to keep deprecated package for compatibility. - "github.com/golang/protobuf/proto" - "github.com/prometheus/common/expfmt" + "github.com/prometheus/client_golang/prometheus/internal" + "github.com/cespare/xxhash/v2" dto "github.com/prometheus/client_model/go" - - "github.com/prometheus/client_golang/prometheus/internal" + "github.com/prometheus/common/expfmt" + "google.golang.org/protobuf/proto" ) const ( @@ -933,6 +932,10 @@ func checkMetricConsistency( h.WriteString(lp.GetValue()) h.Write(separatorByteSlice) } + if dtoMetric.TimestampMs != nil { + h.WriteString(strconv.FormatInt(*(dtoMetric.TimestampMs), 10)) + h.Write(separatorByteSlice) + } hSum := h.Sum64() if _, exists := metricHashes[hSum]; exists { return fmt.Errorf( @@ -962,7 +965,7 @@ func checkDescConsistency( copy(lpsFromDesc, desc.constLabelPairs) for _, l := range desc.variableLabels { lpsFromDesc = append(lpsFromDesc, &dto.LabelPair{ - Name: proto.String(l), + Name: proto.String(l.Name), }) } if len(lpsFromDesc) != len(dtoMetric.Label) { diff --git a/vendor/github.com/prometheus/client_golang/prometheus/summary.go b/vendor/github.com/prometheus/client_golang/prometheus/summary.go index 7bc448a89394..dd359264e592 100644 --- a/vendor/github.com/prometheus/client_golang/prometheus/summary.go +++ b/vendor/github.com/prometheus/client_golang/prometheus/summary.go @@ -22,11 +22,10 @@ import ( "sync/atomic" "time" - "github.com/beorn7/perks/quantile" - //nolint:staticcheck // Ignore SA1019. Need to keep deprecated package for compatibility. - "github.com/golang/protobuf/proto" - dto "github.com/prometheus/client_model/go" + + "github.com/beorn7/perks/quantile" + "google.golang.org/protobuf/proto" ) // quantileLabel is used for the label that defines the quantile in a @@ -148,6 +147,18 @@ type SummaryOpts struct { BufCap uint32 } +// SummaryVecOpts bundles the options to create a SummaryVec metric. +// It is mandatory to set SummaryOpts, see there for mandatory fields. VariableLabels +// is optional and can safely be left to its default value. +type SummaryVecOpts struct { + SummaryOpts + + // VariableLabels are used to partition the metric vector by the given set + // of labels. Each label value will be constrained with the optional Contraint + // function, if provided. + VariableLabels ConstrainableLabels +} + // Problem with the sliding-window decay algorithm... The Merge method of // perk/quantile is actually not working as advertised - and it might be // unfixable, as the underlying algorithm is apparently not capable of merging @@ -178,11 +189,11 @@ func NewSummary(opts SummaryOpts) Summary { func newSummary(desc *Desc, opts SummaryOpts, labelValues ...string) Summary { if len(desc.variableLabels) != len(labelValues) { - panic(makeInconsistentCardinalityError(desc.fqName, desc.variableLabels, labelValues)) + panic(makeInconsistentCardinalityError(desc.fqName, desc.variableLabels.labelNames(), labelValues)) } for _, n := range desc.variableLabels { - if n == quantileLabel { + if n.Name == quantileLabel { panic(errQuantileLabelNotAllowed) } } @@ -530,20 +541,28 @@ type SummaryVec struct { // it is handled by the Prometheus server internally, “quantile” is an illegal // label name. NewSummaryVec will panic if this label name is used. func NewSummaryVec(opts SummaryOpts, labelNames []string) *SummaryVec { - for _, ln := range labelNames { + return V2.NewSummaryVec(SummaryVecOpts{ + SummaryOpts: opts, + VariableLabels: UnconstrainedLabels(labelNames), + }) +} + +// NewSummaryVec creates a new SummaryVec based on the provided SummaryVecOpts. +func (v2) NewSummaryVec(opts SummaryVecOpts) *SummaryVec { + for _, ln := range opts.VariableLabels.labelNames() { if ln == quantileLabel { panic(errQuantileLabelNotAllowed) } } - desc := NewDesc( + desc := V2.NewDesc( BuildFQName(opts.Namespace, opts.Subsystem, opts.Name), opts.Help, - labelNames, + opts.VariableLabels, opts.ConstLabels, ) return &SummaryVec{ MetricVec: NewMetricVec(desc, func(lvs ...string) Metric { - return newSummary(desc, opts, lvs...) + return newSummary(desc, opts.SummaryOpts, lvs...) }), } } diff --git a/vendor/github.com/prometheus/client_golang/prometheus/timer.go b/vendor/github.com/prometheus/client_golang/prometheus/timer.go index f28a76f3a62a..52344fef53f5 100644 --- a/vendor/github.com/prometheus/client_golang/prometheus/timer.go +++ b/vendor/github.com/prometheus/client_golang/prometheus/timer.go @@ -23,7 +23,9 @@ type Timer struct { } // NewTimer creates a new Timer. The provided Observer is used to observe a -// duration in seconds. Timer is usually used to time a function call in the +// duration in seconds. If the Observer implements ExemplarObserver, passing exemplar +// later on will be also supported. +// Timer is usually used to time a function call in the // following way: // // func TimeMe() { @@ -31,6 +33,14 @@ type Timer struct { // defer timer.ObserveDuration() // // Do actual work. // } +// +// or +// +// func TimeMeWithExemplar() { +// timer := NewTimer(myHistogram) +// defer timer.ObserveDurationWithExemplar(exemplar) +// // Do actual work. +// } func NewTimer(o Observer) *Timer { return &Timer{ begin: time.Now(), @@ -53,3 +63,19 @@ func (t *Timer) ObserveDuration() time.Duration { } return d } + +// ObserveDurationWithExemplar is like ObserveDuration, but it will also +// observe exemplar with the duration unless exemplar is nil or provided Observer can't +// be casted to ExemplarObserver. +func (t *Timer) ObserveDurationWithExemplar(exemplar Labels) time.Duration { + d := time.Since(t.begin) + eo, ok := t.observer.(ExemplarObserver) + if ok && exemplar != nil { + eo.ObserveWithExemplar(d.Seconds(), exemplar) + return d + } + if t.observer != nil { + t.observer.Observe(d.Seconds()) + } + return d +} diff --git a/vendor/github.com/prometheus/client_golang/prometheus/value.go b/vendor/github.com/prometheus/client_golang/prometheus/value.go index 2d3abc1cbd68..5f6bb80014de 100644 --- a/vendor/github.com/prometheus/client_golang/prometheus/value.go +++ b/vendor/github.com/prometheus/client_golang/prometheus/value.go @@ -19,13 +19,11 @@ import ( "time" "unicode/utf8" - //nolint:staticcheck // Ignore SA1019. Need to keep deprecated package for compatibility. - "github.com/golang/protobuf/proto" - "google.golang.org/protobuf/types/known/timestamppb" - "github.com/prometheus/client_golang/prometheus/internal" dto "github.com/prometheus/client_model/go" + "google.golang.org/protobuf/proto" + "google.golang.org/protobuf/types/known/timestamppb" ) // ValueType is an enumeration of metric types that represent a simple value. @@ -188,9 +186,9 @@ func MakeLabelPairs(desc *Desc, labelValues []string) []*dto.LabelPair { return desc.constLabelPairs } labelPairs := make([]*dto.LabelPair, 0, totalLen) - for i, n := range desc.variableLabels { + for i, l := range desc.variableLabels { labelPairs = append(labelPairs, &dto.LabelPair{ - Name: proto.String(n), + Name: proto.String(l.Name), Value: proto.String(labelValues[i]), }) } diff --git a/vendor/github.com/prometheus/client_golang/prometheus/vec.go b/vendor/github.com/prometheus/client_golang/prometheus/vec.go index 7ae322590c86..f0d0015a0ff9 100644 --- a/vendor/github.com/prometheus/client_golang/prometheus/vec.go +++ b/vendor/github.com/prometheus/client_golang/prometheus/vec.go @@ -20,6 +20,24 @@ import ( "github.com/prometheus/common/model" ) +var labelsPool = &sync.Pool{ + New: func() interface{} { + return make(Labels) + }, +} + +func getLabelsFromPool() Labels { + return labelsPool.Get().(Labels) +} + +func putLabelsToPool(labels Labels) { + for k := range labels { + delete(labels, k) + } + + labelsPool.Put(labels) +} + // MetricVec is a Collector to bundle metrics of the same name that differ in // their label values. MetricVec is not used directly but as a building block // for implementations of vectors of a given metric type, like GaugeVec, @@ -72,6 +90,7 @@ func NewMetricVec(desc *Desc, newMetric func(lvs ...string) Metric) *MetricVec { // with a performance overhead (for creating and processing the Labels map). // See also the CounterVec example. func (m *MetricVec) DeleteLabelValues(lvs ...string) bool { + lvs = constrainLabelValues(m.desc, lvs, m.curry) h, err := m.hashLabelValues(lvs) if err != nil { return false @@ -91,6 +110,9 @@ func (m *MetricVec) DeleteLabelValues(lvs ...string) bool { // This method is used for the same purpose as DeleteLabelValues(...string). See // there for pros and cons of the two methods. func (m *MetricVec) Delete(labels Labels) bool { + labels = constrainLabels(m.desc, labels) + defer putLabelsToPool(labels) + h, err := m.hashLabels(labels) if err != nil { return false @@ -106,6 +128,9 @@ func (m *MetricVec) Delete(labels Labels) bool { // Note that curried labels will never be matched if deleting from the curried vector. // To match curried labels with DeletePartialMatch, it must be called on the base vector. func (m *MetricVec) DeletePartialMatch(labels Labels) int { + labels = constrainLabels(m.desc, labels) + defer putLabelsToPool(labels) + return m.metricMap.deleteByLabels(labels, m.curry) } @@ -145,10 +170,10 @@ func (m *MetricVec) CurryWith(labels Labels) (*MetricVec, error) { iCurry int ) for i, label := range m.desc.variableLabels { - val, ok := labels[label] + val, ok := labels[label.Name] if iCurry < len(oldCurry) && oldCurry[iCurry].index == i { if ok { - return nil, fmt.Errorf("label name %q is already curried", label) + return nil, fmt.Errorf("label name %q is already curried", label.Name) } newCurry = append(newCurry, oldCurry[iCurry]) iCurry++ @@ -156,7 +181,7 @@ func (m *MetricVec) CurryWith(labels Labels) (*MetricVec, error) { if !ok { continue // Label stays uncurried. } - newCurry = append(newCurry, curriedLabelValue{i, val}) + newCurry = append(newCurry, curriedLabelValue{i, label.Constrain(val)}) } } if l := len(oldCurry) + len(labels) - len(newCurry); l > 0 { @@ -199,6 +224,7 @@ func (m *MetricVec) CurryWith(labels Labels) (*MetricVec, error) { // a wrapper around MetricVec, implementing a vector for a specific Metric // implementation, for example GaugeVec. func (m *MetricVec) GetMetricWithLabelValues(lvs ...string) (Metric, error) { + lvs = constrainLabelValues(m.desc, lvs, m.curry) h, err := m.hashLabelValues(lvs) if err != nil { return nil, err @@ -224,6 +250,9 @@ func (m *MetricVec) GetMetricWithLabelValues(lvs ...string) (Metric, error) { // around MetricVec, implementing a vector for a specific Metric implementation, // for example GaugeVec. func (m *MetricVec) GetMetricWith(labels Labels) (Metric, error) { + labels = constrainLabels(m.desc, labels) + defer putLabelsToPool(labels) + h, err := m.hashLabels(labels) if err != nil { return nil, err @@ -266,16 +295,16 @@ func (m *MetricVec) hashLabels(labels Labels) (uint64, error) { iCurry int ) for i, label := range m.desc.variableLabels { - val, ok := labels[label] + val, ok := labels[label.Name] if iCurry < len(curry) && curry[iCurry].index == i { if ok { - return 0, fmt.Errorf("label name %q is already curried", label) + return 0, fmt.Errorf("label name %q is already curried", label.Name) } h = m.hashAdd(h, curry[iCurry].value) iCurry++ } else { if !ok { - return 0, fmt.Errorf("label name %q missing in label map", label) + return 0, fmt.Errorf("label name %q missing in label map", label.Name) } h = m.hashAdd(h, val) } @@ -453,7 +482,7 @@ func valueMatchesVariableOrCurriedValue(targetValue string, index int, values [] func matchPartialLabels(desc *Desc, values []string, labels Labels, curry []curriedLabelValue) bool { for l, v := range labels { // Check if the target label exists in our metrics and get the index. - varLabelIndex, validLabel := indexOf(l, desc.variableLabels) + varLabelIndex, validLabel := indexOf(l, desc.variableLabels.labelNames()) if validLabel { // Check the value of that label against the target value. // We don't consider curried values in partial matches. @@ -605,7 +634,7 @@ func matchLabels(desc *Desc, values []string, labels Labels, curry []curriedLabe iCurry++ continue } - if values[i] != labels[k] { + if values[i] != labels[k.Name] { return false } } @@ -621,7 +650,7 @@ func extractLabelValues(desc *Desc, labels Labels, curry []curriedLabelValue) [] iCurry++ continue } - labelValues[i] = labels[k] + labelValues[i] = labels[k.Name] } return labelValues } @@ -640,3 +669,35 @@ func inlineLabelValues(lvs []string, curry []curriedLabelValue) []string { } return labelValues } + +func constrainLabels(desc *Desc, labels Labels) Labels { + constrainedLabels := getLabelsFromPool() + for l, v := range labels { + if i, ok := indexOf(l, desc.variableLabels.labelNames()); ok { + v = desc.variableLabels[i].Constrain(v) + } + + constrainedLabels[l] = v + } + + return constrainedLabels +} + +func constrainLabelValues(desc *Desc, lvs []string, curry []curriedLabelValue) []string { + constrainedValues := make([]string, len(lvs)) + var iCurry, iLVs int + for i := 0; i < len(lvs)+len(curry); i++ { + if iCurry < len(curry) && curry[iCurry].index == i { + iCurry++ + continue + } + + if i < len(desc.variableLabels) { + constrainedValues[iLVs] = desc.variableLabels[i].Constrain(lvs[iLVs]) + } else { + constrainedValues[iLVs] = lvs[iLVs] + } + iLVs++ + } + return constrainedValues +} diff --git a/vendor/github.com/prometheus/client_golang/prometheus/vnext.go b/vendor/github.com/prometheus/client_golang/prometheus/vnext.go new file mode 100644 index 000000000000..42bc3a8f0661 --- /dev/null +++ b/vendor/github.com/prometheus/client_golang/prometheus/vnext.go @@ -0,0 +1,23 @@ +// Copyright 2022 The Prometheus Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package prometheus + +type v2 struct{} + +// V2 is a struct that can be referenced to access experimental API that might +// be present in v2 of client golang someday. It offers extended functionality +// of v1 with slightly changed API. It is acceptable to use some pieces from v1 +// and e.g `prometheus.NewGauge` and some from v2 e.g. `prometheus.V2.NewDesc` +// in the same codebase. +var V2 = v2{} diff --git a/vendor/github.com/prometheus/client_golang/prometheus/wrap.go b/vendor/github.com/prometheus/client_golang/prometheus/wrap.go index 1498ee144cb0..25da157f152c 100644 --- a/vendor/github.com/prometheus/client_golang/prometheus/wrap.go +++ b/vendor/github.com/prometheus/client_golang/prometheus/wrap.go @@ -17,12 +17,10 @@ import ( "fmt" "sort" - //nolint:staticcheck // Ignore SA1019. Need to keep deprecated package for compatibility. - "github.com/golang/protobuf/proto" + "github.com/prometheus/client_golang/prometheus/internal" dto "github.com/prometheus/client_model/go" - - "github.com/prometheus/client_golang/prometheus/internal" + "google.golang.org/protobuf/proto" ) // WrapRegistererWith returns a Registerer wrapping the provided @@ -206,7 +204,7 @@ func wrapDesc(desc *Desc, prefix string, labels Labels) *Desc { constLabels[ln] = lv } // NewDesc will do remaining validations. - newDesc := NewDesc(prefix+desc.fqName, desc.help, desc.variableLabels, constLabels) + newDesc := V2.NewDesc(prefix+desc.fqName, desc.help, desc.variableLabels, constLabels) // Propagate errors if there was any. This will override any errer // created by NewDesc above, i.e. earlier errors get precedence. if desc.err != nil { diff --git a/vendor/github.com/prometheus/client_model/go/metrics.pb.go b/vendor/github.com/prometheus/client_model/go/metrics.pb.go index 35904ea19861..2b5bca4b999a 100644 --- a/vendor/github.com/prometheus/client_model/go/metrics.pb.go +++ b/vendor/github.com/prometheus/client_model/go/metrics.pb.go @@ -1,25 +1,38 @@ +// Copyright 2013 Prometheus Team +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + // Code generated by protoc-gen-go. DO NOT EDIT. +// versions: +// protoc-gen-go v1.30.0 +// protoc v3.20.3 // source: io/prometheus/client/metrics.proto package io_prometheus_client import ( - fmt "fmt" - proto "github.com/golang/protobuf/proto" - timestamp "github.com/golang/protobuf/ptypes/timestamp" - math "math" + protoreflect "google.golang.org/protobuf/reflect/protoreflect" + protoimpl "google.golang.org/protobuf/runtime/protoimpl" + timestamppb "google.golang.org/protobuf/types/known/timestamppb" + reflect "reflect" + sync "sync" ) -// Reference imports to suppress errors if they are not otherwise used. -var _ = proto.Marshal -var _ = fmt.Errorf -var _ = math.Inf - -// This is a compile-time assertion to ensure that this generated file -// is compatible with the proto package it is being compiled against. -// A compilation error at this line likely means your copy of the -// proto package needs to be updated. -const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package +const ( + // Verify that this generated code is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) + // Verify that runtime/protoimpl is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) +) type MetricType int32 @@ -38,23 +51,25 @@ const ( MetricType_GAUGE_HISTOGRAM MetricType = 5 ) -var MetricType_name = map[int32]string{ - 0: "COUNTER", - 1: "GAUGE", - 2: "SUMMARY", - 3: "UNTYPED", - 4: "HISTOGRAM", - 5: "GAUGE_HISTOGRAM", -} - -var MetricType_value = map[string]int32{ - "COUNTER": 0, - "GAUGE": 1, - "SUMMARY": 2, - "UNTYPED": 3, - "HISTOGRAM": 4, - "GAUGE_HISTOGRAM": 5, -} +// Enum value maps for MetricType. +var ( + MetricType_name = map[int32]string{ + 0: "COUNTER", + 1: "GAUGE", + 2: "SUMMARY", + 3: "UNTYPED", + 4: "HISTOGRAM", + 5: "GAUGE_HISTOGRAM", + } + MetricType_value = map[string]int32{ + "COUNTER": 0, + "GAUGE": 1, + "SUMMARY": 2, + "UNTYPED": 3, + "HISTOGRAM": 4, + "GAUGE_HISTOGRAM": 5, + } +) func (x MetricType) Enum() *MetricType { p := new(MetricType) @@ -63,449 +78,519 @@ func (x MetricType) Enum() *MetricType { } func (x MetricType) String() string { - return proto.EnumName(MetricType_name, int32(x)) + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) } -func (x *MetricType) UnmarshalJSON(data []byte) error { - value, err := proto.UnmarshalJSONEnum(MetricType_value, data, "MetricType") +func (MetricType) Descriptor() protoreflect.EnumDescriptor { + return file_io_prometheus_client_metrics_proto_enumTypes[0].Descriptor() +} + +func (MetricType) Type() protoreflect.EnumType { + return &file_io_prometheus_client_metrics_proto_enumTypes[0] +} + +func (x MetricType) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Do not use. +func (x *MetricType) UnmarshalJSON(b []byte) error { + num, err := protoimpl.X.UnmarshalJSONEnum(x.Descriptor(), b) if err != nil { return err } - *x = MetricType(value) + *x = MetricType(num) return nil } +// Deprecated: Use MetricType.Descriptor instead. func (MetricType) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_d1e5ddb18987a258, []int{0} + return file_io_prometheus_client_metrics_proto_rawDescGZIP(), []int{0} } type LabelPair struct { - Name *string `protobuf:"bytes,1,opt,name=name" json:"name,omitempty"` - Value *string `protobuf:"bytes,2,opt,name=value" json:"value,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields -func (m *LabelPair) Reset() { *m = LabelPair{} } -func (m *LabelPair) String() string { return proto.CompactTextString(m) } -func (*LabelPair) ProtoMessage() {} -func (*LabelPair) Descriptor() ([]byte, []int) { - return fileDescriptor_d1e5ddb18987a258, []int{0} + Name *string `protobuf:"bytes,1,opt,name=name" json:"name,omitempty"` + Value *string `protobuf:"bytes,2,opt,name=value" json:"value,omitempty"` } -func (m *LabelPair) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_LabelPair.Unmarshal(m, b) -} -func (m *LabelPair) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_LabelPair.Marshal(b, m, deterministic) -} -func (m *LabelPair) XXX_Merge(src proto.Message) { - xxx_messageInfo_LabelPair.Merge(m, src) +func (x *LabelPair) Reset() { + *x = LabelPair{} + if protoimpl.UnsafeEnabled { + mi := &file_io_prometheus_client_metrics_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } } -func (m *LabelPair) XXX_Size() int { - return xxx_messageInfo_LabelPair.Size(m) + +func (x *LabelPair) String() string { + return protoimpl.X.MessageStringOf(x) } -func (m *LabelPair) XXX_DiscardUnknown() { - xxx_messageInfo_LabelPair.DiscardUnknown(m) + +func (*LabelPair) ProtoMessage() {} + +func (x *LabelPair) ProtoReflect() protoreflect.Message { + mi := &file_io_prometheus_client_metrics_proto_msgTypes[0] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) } -var xxx_messageInfo_LabelPair proto.InternalMessageInfo +// Deprecated: Use LabelPair.ProtoReflect.Descriptor instead. +func (*LabelPair) Descriptor() ([]byte, []int) { + return file_io_prometheus_client_metrics_proto_rawDescGZIP(), []int{0} +} -func (m *LabelPair) GetName() string { - if m != nil && m.Name != nil { - return *m.Name +func (x *LabelPair) GetName() string { + if x != nil && x.Name != nil { + return *x.Name } return "" } -func (m *LabelPair) GetValue() string { - if m != nil && m.Value != nil { - return *m.Value +func (x *LabelPair) GetValue() string { + if x != nil && x.Value != nil { + return *x.Value } return "" } type Gauge struct { - Value *float64 `protobuf:"fixed64,1,opt,name=value" json:"value,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields -func (m *Gauge) Reset() { *m = Gauge{} } -func (m *Gauge) String() string { return proto.CompactTextString(m) } -func (*Gauge) ProtoMessage() {} -func (*Gauge) Descriptor() ([]byte, []int) { - return fileDescriptor_d1e5ddb18987a258, []int{1} + Value *float64 `protobuf:"fixed64,1,opt,name=value" json:"value,omitempty"` } -func (m *Gauge) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_Gauge.Unmarshal(m, b) -} -func (m *Gauge) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_Gauge.Marshal(b, m, deterministic) -} -func (m *Gauge) XXX_Merge(src proto.Message) { - xxx_messageInfo_Gauge.Merge(m, src) +func (x *Gauge) Reset() { + *x = Gauge{} + if protoimpl.UnsafeEnabled { + mi := &file_io_prometheus_client_metrics_proto_msgTypes[1] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } } -func (m *Gauge) XXX_Size() int { - return xxx_messageInfo_Gauge.Size(m) + +func (x *Gauge) String() string { + return protoimpl.X.MessageStringOf(x) } -func (m *Gauge) XXX_DiscardUnknown() { - xxx_messageInfo_Gauge.DiscardUnknown(m) + +func (*Gauge) ProtoMessage() {} + +func (x *Gauge) ProtoReflect() protoreflect.Message { + mi := &file_io_prometheus_client_metrics_proto_msgTypes[1] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) } -var xxx_messageInfo_Gauge proto.InternalMessageInfo +// Deprecated: Use Gauge.ProtoReflect.Descriptor instead. +func (*Gauge) Descriptor() ([]byte, []int) { + return file_io_prometheus_client_metrics_proto_rawDescGZIP(), []int{1} +} -func (m *Gauge) GetValue() float64 { - if m != nil && m.Value != nil { - return *m.Value +func (x *Gauge) GetValue() float64 { + if x != nil && x.Value != nil { + return *x.Value } return 0 } type Counter struct { - Value *float64 `protobuf:"fixed64,1,opt,name=value" json:"value,omitempty"` - Exemplar *Exemplar `protobuf:"bytes,2,opt,name=exemplar" json:"exemplar,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields -func (m *Counter) Reset() { *m = Counter{} } -func (m *Counter) String() string { return proto.CompactTextString(m) } -func (*Counter) ProtoMessage() {} -func (*Counter) Descriptor() ([]byte, []int) { - return fileDescriptor_d1e5ddb18987a258, []int{2} + Value *float64 `protobuf:"fixed64,1,opt,name=value" json:"value,omitempty"` + Exemplar *Exemplar `protobuf:"bytes,2,opt,name=exemplar" json:"exemplar,omitempty"` } -func (m *Counter) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_Counter.Unmarshal(m, b) -} -func (m *Counter) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_Counter.Marshal(b, m, deterministic) -} -func (m *Counter) XXX_Merge(src proto.Message) { - xxx_messageInfo_Counter.Merge(m, src) +func (x *Counter) Reset() { + *x = Counter{} + if protoimpl.UnsafeEnabled { + mi := &file_io_prometheus_client_metrics_proto_msgTypes[2] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } } -func (m *Counter) XXX_Size() int { - return xxx_messageInfo_Counter.Size(m) + +func (x *Counter) String() string { + return protoimpl.X.MessageStringOf(x) } -func (m *Counter) XXX_DiscardUnknown() { - xxx_messageInfo_Counter.DiscardUnknown(m) + +func (*Counter) ProtoMessage() {} + +func (x *Counter) ProtoReflect() protoreflect.Message { + mi := &file_io_prometheus_client_metrics_proto_msgTypes[2] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) } -var xxx_messageInfo_Counter proto.InternalMessageInfo +// Deprecated: Use Counter.ProtoReflect.Descriptor instead. +func (*Counter) Descriptor() ([]byte, []int) { + return file_io_prometheus_client_metrics_proto_rawDescGZIP(), []int{2} +} -func (m *Counter) GetValue() float64 { - if m != nil && m.Value != nil { - return *m.Value +func (x *Counter) GetValue() float64 { + if x != nil && x.Value != nil { + return *x.Value } return 0 } -func (m *Counter) GetExemplar() *Exemplar { - if m != nil { - return m.Exemplar +func (x *Counter) GetExemplar() *Exemplar { + if x != nil { + return x.Exemplar } return nil } type Quantile struct { - Quantile *float64 `protobuf:"fixed64,1,opt,name=quantile" json:"quantile,omitempty"` - Value *float64 `protobuf:"fixed64,2,opt,name=value" json:"value,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields -func (m *Quantile) Reset() { *m = Quantile{} } -func (m *Quantile) String() string { return proto.CompactTextString(m) } -func (*Quantile) ProtoMessage() {} -func (*Quantile) Descriptor() ([]byte, []int) { - return fileDescriptor_d1e5ddb18987a258, []int{3} + Quantile *float64 `protobuf:"fixed64,1,opt,name=quantile" json:"quantile,omitempty"` + Value *float64 `protobuf:"fixed64,2,opt,name=value" json:"value,omitempty"` } -func (m *Quantile) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_Quantile.Unmarshal(m, b) -} -func (m *Quantile) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_Quantile.Marshal(b, m, deterministic) -} -func (m *Quantile) XXX_Merge(src proto.Message) { - xxx_messageInfo_Quantile.Merge(m, src) +func (x *Quantile) Reset() { + *x = Quantile{} + if protoimpl.UnsafeEnabled { + mi := &file_io_prometheus_client_metrics_proto_msgTypes[3] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } } -func (m *Quantile) XXX_Size() int { - return xxx_messageInfo_Quantile.Size(m) + +func (x *Quantile) String() string { + return protoimpl.X.MessageStringOf(x) } -func (m *Quantile) XXX_DiscardUnknown() { - xxx_messageInfo_Quantile.DiscardUnknown(m) + +func (*Quantile) ProtoMessage() {} + +func (x *Quantile) ProtoReflect() protoreflect.Message { + mi := &file_io_prometheus_client_metrics_proto_msgTypes[3] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) } -var xxx_messageInfo_Quantile proto.InternalMessageInfo +// Deprecated: Use Quantile.ProtoReflect.Descriptor instead. +func (*Quantile) Descriptor() ([]byte, []int) { + return file_io_prometheus_client_metrics_proto_rawDescGZIP(), []int{3} +} -func (m *Quantile) GetQuantile() float64 { - if m != nil && m.Quantile != nil { - return *m.Quantile +func (x *Quantile) GetQuantile() float64 { + if x != nil && x.Quantile != nil { + return *x.Quantile } return 0 } -func (m *Quantile) GetValue() float64 { - if m != nil && m.Value != nil { - return *m.Value +func (x *Quantile) GetValue() float64 { + if x != nil && x.Value != nil { + return *x.Value } return 0 } type Summary struct { - SampleCount *uint64 `protobuf:"varint,1,opt,name=sample_count,json=sampleCount" json:"sample_count,omitempty"` - SampleSum *float64 `protobuf:"fixed64,2,opt,name=sample_sum,json=sampleSum" json:"sample_sum,omitempty"` - Quantile []*Quantile `protobuf:"bytes,3,rep,name=quantile" json:"quantile,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields -func (m *Summary) Reset() { *m = Summary{} } -func (m *Summary) String() string { return proto.CompactTextString(m) } -func (*Summary) ProtoMessage() {} -func (*Summary) Descriptor() ([]byte, []int) { - return fileDescriptor_d1e5ddb18987a258, []int{4} + SampleCount *uint64 `protobuf:"varint,1,opt,name=sample_count,json=sampleCount" json:"sample_count,omitempty"` + SampleSum *float64 `protobuf:"fixed64,2,opt,name=sample_sum,json=sampleSum" json:"sample_sum,omitempty"` + Quantile []*Quantile `protobuf:"bytes,3,rep,name=quantile" json:"quantile,omitempty"` } -func (m *Summary) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_Summary.Unmarshal(m, b) -} -func (m *Summary) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_Summary.Marshal(b, m, deterministic) -} -func (m *Summary) XXX_Merge(src proto.Message) { - xxx_messageInfo_Summary.Merge(m, src) +func (x *Summary) Reset() { + *x = Summary{} + if protoimpl.UnsafeEnabled { + mi := &file_io_prometheus_client_metrics_proto_msgTypes[4] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } } -func (m *Summary) XXX_Size() int { - return xxx_messageInfo_Summary.Size(m) + +func (x *Summary) String() string { + return protoimpl.X.MessageStringOf(x) } -func (m *Summary) XXX_DiscardUnknown() { - xxx_messageInfo_Summary.DiscardUnknown(m) + +func (*Summary) ProtoMessage() {} + +func (x *Summary) ProtoReflect() protoreflect.Message { + mi := &file_io_prometheus_client_metrics_proto_msgTypes[4] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) } -var xxx_messageInfo_Summary proto.InternalMessageInfo +// Deprecated: Use Summary.ProtoReflect.Descriptor instead. +func (*Summary) Descriptor() ([]byte, []int) { + return file_io_prometheus_client_metrics_proto_rawDescGZIP(), []int{4} +} -func (m *Summary) GetSampleCount() uint64 { - if m != nil && m.SampleCount != nil { - return *m.SampleCount +func (x *Summary) GetSampleCount() uint64 { + if x != nil && x.SampleCount != nil { + return *x.SampleCount } return 0 } -func (m *Summary) GetSampleSum() float64 { - if m != nil && m.SampleSum != nil { - return *m.SampleSum +func (x *Summary) GetSampleSum() float64 { + if x != nil && x.SampleSum != nil { + return *x.SampleSum } return 0 } -func (m *Summary) GetQuantile() []*Quantile { - if m != nil { - return m.Quantile +func (x *Summary) GetQuantile() []*Quantile { + if x != nil { + return x.Quantile } return nil } type Untyped struct { - Value *float64 `protobuf:"fixed64,1,opt,name=value" json:"value,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields -func (m *Untyped) Reset() { *m = Untyped{} } -func (m *Untyped) String() string { return proto.CompactTextString(m) } -func (*Untyped) ProtoMessage() {} -func (*Untyped) Descriptor() ([]byte, []int) { - return fileDescriptor_d1e5ddb18987a258, []int{5} + Value *float64 `protobuf:"fixed64,1,opt,name=value" json:"value,omitempty"` } -func (m *Untyped) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_Untyped.Unmarshal(m, b) -} -func (m *Untyped) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_Untyped.Marshal(b, m, deterministic) -} -func (m *Untyped) XXX_Merge(src proto.Message) { - xxx_messageInfo_Untyped.Merge(m, src) +func (x *Untyped) Reset() { + *x = Untyped{} + if protoimpl.UnsafeEnabled { + mi := &file_io_prometheus_client_metrics_proto_msgTypes[5] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } } -func (m *Untyped) XXX_Size() int { - return xxx_messageInfo_Untyped.Size(m) + +func (x *Untyped) String() string { + return protoimpl.X.MessageStringOf(x) } -func (m *Untyped) XXX_DiscardUnknown() { - xxx_messageInfo_Untyped.DiscardUnknown(m) + +func (*Untyped) ProtoMessage() {} + +func (x *Untyped) ProtoReflect() protoreflect.Message { + mi := &file_io_prometheus_client_metrics_proto_msgTypes[5] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) } -var xxx_messageInfo_Untyped proto.InternalMessageInfo +// Deprecated: Use Untyped.ProtoReflect.Descriptor instead. +func (*Untyped) Descriptor() ([]byte, []int) { + return file_io_prometheus_client_metrics_proto_rawDescGZIP(), []int{5} +} -func (m *Untyped) GetValue() float64 { - if m != nil && m.Value != nil { - return *m.Value +func (x *Untyped) GetValue() float64 { + if x != nil && x.Value != nil { + return *x.Value } return 0 } type Histogram struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + SampleCount *uint64 `protobuf:"varint,1,opt,name=sample_count,json=sampleCount" json:"sample_count,omitempty"` - SampleCountFloat *float64 `protobuf:"fixed64,4,opt,name=sample_count_float,json=sampleCountFloat" json:"sample_count_float,omitempty"` + SampleCountFloat *float64 `protobuf:"fixed64,4,opt,name=sample_count_float,json=sampleCountFloat" json:"sample_count_float,omitempty"` // Overrides sample_count if > 0. SampleSum *float64 `protobuf:"fixed64,2,opt,name=sample_sum,json=sampleSum" json:"sample_sum,omitempty"` // Buckets for the conventional histogram. - Bucket []*Bucket `protobuf:"bytes,3,rep,name=bucket" json:"bucket,omitempty"` + Bucket []*Bucket `protobuf:"bytes,3,rep,name=bucket" json:"bucket,omitempty"` // Ordered in increasing order of upper_bound, +Inf bucket is optional. // schema defines the bucket schema. Currently, valid numbers are -4 <= n <= 8. // They are all for base-2 bucket schemas, where 1 is a bucket boundary in each case, and // then each power of two is divided into 2^n logarithmic buckets. // Or in other words, each bucket boundary is the previous boundary times 2^(2^-n). // In the future, more bucket schemas may be added using numbers < -4 or > 8. Schema *int32 `protobuf:"zigzag32,5,opt,name=schema" json:"schema,omitempty"` - ZeroThreshold *float64 `protobuf:"fixed64,6,opt,name=zero_threshold,json=zeroThreshold" json:"zero_threshold,omitempty"` - ZeroCount *uint64 `protobuf:"varint,7,opt,name=zero_count,json=zeroCount" json:"zero_count,omitempty"` - ZeroCountFloat *float64 `protobuf:"fixed64,8,opt,name=zero_count_float,json=zeroCountFloat" json:"zero_count_float,omitempty"` + ZeroThreshold *float64 `protobuf:"fixed64,6,opt,name=zero_threshold,json=zeroThreshold" json:"zero_threshold,omitempty"` // Breadth of the zero bucket. + ZeroCount *uint64 `protobuf:"varint,7,opt,name=zero_count,json=zeroCount" json:"zero_count,omitempty"` // Count in zero bucket. + ZeroCountFloat *float64 `protobuf:"fixed64,8,opt,name=zero_count_float,json=zeroCountFloat" json:"zero_count_float,omitempty"` // Overrides sb_zero_count if > 0. // Negative buckets for the native histogram. NegativeSpan []*BucketSpan `protobuf:"bytes,9,rep,name=negative_span,json=negativeSpan" json:"negative_span,omitempty"` // Use either "negative_delta" or "negative_count", the former for // regular histograms with integer counts, the latter for float // histograms. - NegativeDelta []int64 `protobuf:"zigzag64,10,rep,name=negative_delta,json=negativeDelta" json:"negative_delta,omitempty"` - NegativeCount []float64 `protobuf:"fixed64,11,rep,name=negative_count,json=negativeCount" json:"negative_count,omitempty"` + NegativeDelta []int64 `protobuf:"zigzag64,10,rep,name=negative_delta,json=negativeDelta" json:"negative_delta,omitempty"` // Count delta of each bucket compared to previous one (or to zero for 1st bucket). + NegativeCount []float64 `protobuf:"fixed64,11,rep,name=negative_count,json=negativeCount" json:"negative_count,omitempty"` // Absolute count of each bucket. // Positive buckets for the native histogram. PositiveSpan []*BucketSpan `protobuf:"bytes,12,rep,name=positive_span,json=positiveSpan" json:"positive_span,omitempty"` // Use either "positive_delta" or "positive_count", the former for // regular histograms with integer counts, the latter for float // histograms. - PositiveDelta []int64 `protobuf:"zigzag64,13,rep,name=positive_delta,json=positiveDelta" json:"positive_delta,omitempty"` - PositiveCount []float64 `protobuf:"fixed64,14,rep,name=positive_count,json=positiveCount" json:"positive_count,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` + PositiveDelta []int64 `protobuf:"zigzag64,13,rep,name=positive_delta,json=positiveDelta" json:"positive_delta,omitempty"` // Count delta of each bucket compared to previous one (or to zero for 1st bucket). + PositiveCount []float64 `protobuf:"fixed64,14,rep,name=positive_count,json=positiveCount" json:"positive_count,omitempty"` // Absolute count of each bucket. } -func (m *Histogram) Reset() { *m = Histogram{} } -func (m *Histogram) String() string { return proto.CompactTextString(m) } -func (*Histogram) ProtoMessage() {} -func (*Histogram) Descriptor() ([]byte, []int) { - return fileDescriptor_d1e5ddb18987a258, []int{6} +func (x *Histogram) Reset() { + *x = Histogram{} + if protoimpl.UnsafeEnabled { + mi := &file_io_prometheus_client_metrics_proto_msgTypes[6] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } } -func (m *Histogram) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_Histogram.Unmarshal(m, b) +func (x *Histogram) String() string { + return protoimpl.X.MessageStringOf(x) } -func (m *Histogram) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_Histogram.Marshal(b, m, deterministic) -} -func (m *Histogram) XXX_Merge(src proto.Message) { - xxx_messageInfo_Histogram.Merge(m, src) -} -func (m *Histogram) XXX_Size() int { - return xxx_messageInfo_Histogram.Size(m) -} -func (m *Histogram) XXX_DiscardUnknown() { - xxx_messageInfo_Histogram.DiscardUnknown(m) + +func (*Histogram) ProtoMessage() {} + +func (x *Histogram) ProtoReflect() protoreflect.Message { + mi := &file_io_prometheus_client_metrics_proto_msgTypes[6] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) } -var xxx_messageInfo_Histogram proto.InternalMessageInfo +// Deprecated: Use Histogram.ProtoReflect.Descriptor instead. +func (*Histogram) Descriptor() ([]byte, []int) { + return file_io_prometheus_client_metrics_proto_rawDescGZIP(), []int{6} +} -func (m *Histogram) GetSampleCount() uint64 { - if m != nil && m.SampleCount != nil { - return *m.SampleCount +func (x *Histogram) GetSampleCount() uint64 { + if x != nil && x.SampleCount != nil { + return *x.SampleCount } return 0 } -func (m *Histogram) GetSampleCountFloat() float64 { - if m != nil && m.SampleCountFloat != nil { - return *m.SampleCountFloat +func (x *Histogram) GetSampleCountFloat() float64 { + if x != nil && x.SampleCountFloat != nil { + return *x.SampleCountFloat } return 0 } -func (m *Histogram) GetSampleSum() float64 { - if m != nil && m.SampleSum != nil { - return *m.SampleSum +func (x *Histogram) GetSampleSum() float64 { + if x != nil && x.SampleSum != nil { + return *x.SampleSum } return 0 } -func (m *Histogram) GetBucket() []*Bucket { - if m != nil { - return m.Bucket +func (x *Histogram) GetBucket() []*Bucket { + if x != nil { + return x.Bucket } return nil } -func (m *Histogram) GetSchema() int32 { - if m != nil && m.Schema != nil { - return *m.Schema +func (x *Histogram) GetSchema() int32 { + if x != nil && x.Schema != nil { + return *x.Schema } return 0 } -func (m *Histogram) GetZeroThreshold() float64 { - if m != nil && m.ZeroThreshold != nil { - return *m.ZeroThreshold +func (x *Histogram) GetZeroThreshold() float64 { + if x != nil && x.ZeroThreshold != nil { + return *x.ZeroThreshold } return 0 } -func (m *Histogram) GetZeroCount() uint64 { - if m != nil && m.ZeroCount != nil { - return *m.ZeroCount +func (x *Histogram) GetZeroCount() uint64 { + if x != nil && x.ZeroCount != nil { + return *x.ZeroCount } return 0 } -func (m *Histogram) GetZeroCountFloat() float64 { - if m != nil && m.ZeroCountFloat != nil { - return *m.ZeroCountFloat +func (x *Histogram) GetZeroCountFloat() float64 { + if x != nil && x.ZeroCountFloat != nil { + return *x.ZeroCountFloat } return 0 } -func (m *Histogram) GetNegativeSpan() []*BucketSpan { - if m != nil { - return m.NegativeSpan +func (x *Histogram) GetNegativeSpan() []*BucketSpan { + if x != nil { + return x.NegativeSpan } return nil } -func (m *Histogram) GetNegativeDelta() []int64 { - if m != nil { - return m.NegativeDelta +func (x *Histogram) GetNegativeDelta() []int64 { + if x != nil { + return x.NegativeDelta } return nil } -func (m *Histogram) GetNegativeCount() []float64 { - if m != nil { - return m.NegativeCount +func (x *Histogram) GetNegativeCount() []float64 { + if x != nil { + return x.NegativeCount } return nil } -func (m *Histogram) GetPositiveSpan() []*BucketSpan { - if m != nil { - return m.PositiveSpan +func (x *Histogram) GetPositiveSpan() []*BucketSpan { + if x != nil { + return x.PositiveSpan } return nil } -func (m *Histogram) GetPositiveDelta() []int64 { - if m != nil { - return m.PositiveDelta +func (x *Histogram) GetPositiveDelta() []int64 { + if x != nil { + return x.PositiveDelta } return nil } -func (m *Histogram) GetPositiveCount() []float64 { - if m != nil { - return m.PositiveCount +func (x *Histogram) GetPositiveCount() []float64 { + if x != nil { + return x.PositiveCount } return nil } @@ -513,64 +598,72 @@ func (m *Histogram) GetPositiveCount() []float64 { // A Bucket of a conventional histogram, each of which is treated as // an individual counter-like time series by Prometheus. type Bucket struct { - CumulativeCount *uint64 `protobuf:"varint,1,opt,name=cumulative_count,json=cumulativeCount" json:"cumulative_count,omitempty"` - CumulativeCountFloat *float64 `protobuf:"fixed64,4,opt,name=cumulative_count_float,json=cumulativeCountFloat" json:"cumulative_count_float,omitempty"` - UpperBound *float64 `protobuf:"fixed64,2,opt,name=upper_bound,json=upperBound" json:"upper_bound,omitempty"` + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + CumulativeCount *uint64 `protobuf:"varint,1,opt,name=cumulative_count,json=cumulativeCount" json:"cumulative_count,omitempty"` // Cumulative in increasing order. + CumulativeCountFloat *float64 `protobuf:"fixed64,4,opt,name=cumulative_count_float,json=cumulativeCountFloat" json:"cumulative_count_float,omitempty"` // Overrides cumulative_count if > 0. + UpperBound *float64 `protobuf:"fixed64,2,opt,name=upper_bound,json=upperBound" json:"upper_bound,omitempty"` // Inclusive. Exemplar *Exemplar `protobuf:"bytes,3,opt,name=exemplar" json:"exemplar,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` } -func (m *Bucket) Reset() { *m = Bucket{} } -func (m *Bucket) String() string { return proto.CompactTextString(m) } -func (*Bucket) ProtoMessage() {} -func (*Bucket) Descriptor() ([]byte, []int) { - return fileDescriptor_d1e5ddb18987a258, []int{7} +func (x *Bucket) Reset() { + *x = Bucket{} + if protoimpl.UnsafeEnabled { + mi := &file_io_prometheus_client_metrics_proto_msgTypes[7] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } } -func (m *Bucket) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_Bucket.Unmarshal(m, b) -} -func (m *Bucket) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_Bucket.Marshal(b, m, deterministic) -} -func (m *Bucket) XXX_Merge(src proto.Message) { - xxx_messageInfo_Bucket.Merge(m, src) -} -func (m *Bucket) XXX_Size() int { - return xxx_messageInfo_Bucket.Size(m) +func (x *Bucket) String() string { + return protoimpl.X.MessageStringOf(x) } -func (m *Bucket) XXX_DiscardUnknown() { - xxx_messageInfo_Bucket.DiscardUnknown(m) + +func (*Bucket) ProtoMessage() {} + +func (x *Bucket) ProtoReflect() protoreflect.Message { + mi := &file_io_prometheus_client_metrics_proto_msgTypes[7] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) } -var xxx_messageInfo_Bucket proto.InternalMessageInfo +// Deprecated: Use Bucket.ProtoReflect.Descriptor instead. +func (*Bucket) Descriptor() ([]byte, []int) { + return file_io_prometheus_client_metrics_proto_rawDescGZIP(), []int{7} +} -func (m *Bucket) GetCumulativeCount() uint64 { - if m != nil && m.CumulativeCount != nil { - return *m.CumulativeCount +func (x *Bucket) GetCumulativeCount() uint64 { + if x != nil && x.CumulativeCount != nil { + return *x.CumulativeCount } return 0 } -func (m *Bucket) GetCumulativeCountFloat() float64 { - if m != nil && m.CumulativeCountFloat != nil { - return *m.CumulativeCountFloat +func (x *Bucket) GetCumulativeCountFloat() float64 { + if x != nil && x.CumulativeCountFloat != nil { + return *x.CumulativeCountFloat } return 0 } -func (m *Bucket) GetUpperBound() float64 { - if m != nil && m.UpperBound != nil { - return *m.UpperBound +func (x *Bucket) GetUpperBound() float64 { + if x != nil && x.UpperBound != nil { + return *x.UpperBound } return 0 } -func (m *Bucket) GetExemplar() *Exemplar { - if m != nil { - return m.Exemplar +func (x *Bucket) GetExemplar() *Exemplar { + if x != nil { + return x.Exemplar } return nil } @@ -582,333 +675,658 @@ func (m *Bucket) GetExemplar() *Exemplar { // structured here (with all the buckets in a single array separate // from the Spans). type BucketSpan struct { - Offset *int32 `protobuf:"zigzag32,1,opt,name=offset" json:"offset,omitempty"` - Length *uint32 `protobuf:"varint,2,opt,name=length" json:"length,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields -func (m *BucketSpan) Reset() { *m = BucketSpan{} } -func (m *BucketSpan) String() string { return proto.CompactTextString(m) } -func (*BucketSpan) ProtoMessage() {} -func (*BucketSpan) Descriptor() ([]byte, []int) { - return fileDescriptor_d1e5ddb18987a258, []int{8} + Offset *int32 `protobuf:"zigzag32,1,opt,name=offset" json:"offset,omitempty"` // Gap to previous span, or starting point for 1st span (which can be negative). + Length *uint32 `protobuf:"varint,2,opt,name=length" json:"length,omitempty"` // Length of consecutive buckets. } -func (m *BucketSpan) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_BucketSpan.Unmarshal(m, b) -} -func (m *BucketSpan) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_BucketSpan.Marshal(b, m, deterministic) -} -func (m *BucketSpan) XXX_Merge(src proto.Message) { - xxx_messageInfo_BucketSpan.Merge(m, src) +func (x *BucketSpan) Reset() { + *x = BucketSpan{} + if protoimpl.UnsafeEnabled { + mi := &file_io_prometheus_client_metrics_proto_msgTypes[8] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } } -func (m *BucketSpan) XXX_Size() int { - return xxx_messageInfo_BucketSpan.Size(m) + +func (x *BucketSpan) String() string { + return protoimpl.X.MessageStringOf(x) } -func (m *BucketSpan) XXX_DiscardUnknown() { - xxx_messageInfo_BucketSpan.DiscardUnknown(m) + +func (*BucketSpan) ProtoMessage() {} + +func (x *BucketSpan) ProtoReflect() protoreflect.Message { + mi := &file_io_prometheus_client_metrics_proto_msgTypes[8] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) } -var xxx_messageInfo_BucketSpan proto.InternalMessageInfo +// Deprecated: Use BucketSpan.ProtoReflect.Descriptor instead. +func (*BucketSpan) Descriptor() ([]byte, []int) { + return file_io_prometheus_client_metrics_proto_rawDescGZIP(), []int{8} +} -func (m *BucketSpan) GetOffset() int32 { - if m != nil && m.Offset != nil { - return *m.Offset +func (x *BucketSpan) GetOffset() int32 { + if x != nil && x.Offset != nil { + return *x.Offset } return 0 } -func (m *BucketSpan) GetLength() uint32 { - if m != nil && m.Length != nil { - return *m.Length +func (x *BucketSpan) GetLength() uint32 { + if x != nil && x.Length != nil { + return *x.Length } return 0 } type Exemplar struct { - Label []*LabelPair `protobuf:"bytes,1,rep,name=label" json:"label,omitempty"` - Value *float64 `protobuf:"fixed64,2,opt,name=value" json:"value,omitempty"` - Timestamp *timestamp.Timestamp `protobuf:"bytes,3,opt,name=timestamp" json:"timestamp,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields -func (m *Exemplar) Reset() { *m = Exemplar{} } -func (m *Exemplar) String() string { return proto.CompactTextString(m) } -func (*Exemplar) ProtoMessage() {} -func (*Exemplar) Descriptor() ([]byte, []int) { - return fileDescriptor_d1e5ddb18987a258, []int{9} + Label []*LabelPair `protobuf:"bytes,1,rep,name=label" json:"label,omitempty"` + Value *float64 `protobuf:"fixed64,2,opt,name=value" json:"value,omitempty"` + Timestamp *timestamppb.Timestamp `protobuf:"bytes,3,opt,name=timestamp" json:"timestamp,omitempty"` // OpenMetrics-style. } -func (m *Exemplar) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_Exemplar.Unmarshal(m, b) -} -func (m *Exemplar) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_Exemplar.Marshal(b, m, deterministic) -} -func (m *Exemplar) XXX_Merge(src proto.Message) { - xxx_messageInfo_Exemplar.Merge(m, src) +func (x *Exemplar) Reset() { + *x = Exemplar{} + if protoimpl.UnsafeEnabled { + mi := &file_io_prometheus_client_metrics_proto_msgTypes[9] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } } -func (m *Exemplar) XXX_Size() int { - return xxx_messageInfo_Exemplar.Size(m) + +func (x *Exemplar) String() string { + return protoimpl.X.MessageStringOf(x) } -func (m *Exemplar) XXX_DiscardUnknown() { - xxx_messageInfo_Exemplar.DiscardUnknown(m) + +func (*Exemplar) ProtoMessage() {} + +func (x *Exemplar) ProtoReflect() protoreflect.Message { + mi := &file_io_prometheus_client_metrics_proto_msgTypes[9] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) } -var xxx_messageInfo_Exemplar proto.InternalMessageInfo +// Deprecated: Use Exemplar.ProtoReflect.Descriptor instead. +func (*Exemplar) Descriptor() ([]byte, []int) { + return file_io_prometheus_client_metrics_proto_rawDescGZIP(), []int{9} +} -func (m *Exemplar) GetLabel() []*LabelPair { - if m != nil { - return m.Label +func (x *Exemplar) GetLabel() []*LabelPair { + if x != nil { + return x.Label } return nil } -func (m *Exemplar) GetValue() float64 { - if m != nil && m.Value != nil { - return *m.Value +func (x *Exemplar) GetValue() float64 { + if x != nil && x.Value != nil { + return *x.Value } return 0 } -func (m *Exemplar) GetTimestamp() *timestamp.Timestamp { - if m != nil { - return m.Timestamp +func (x *Exemplar) GetTimestamp() *timestamppb.Timestamp { + if x != nil { + return x.Timestamp } return nil } type Metric struct { - Label []*LabelPair `protobuf:"bytes,1,rep,name=label" json:"label,omitempty"` - Gauge *Gauge `protobuf:"bytes,2,opt,name=gauge" json:"gauge,omitempty"` - Counter *Counter `protobuf:"bytes,3,opt,name=counter" json:"counter,omitempty"` - Summary *Summary `protobuf:"bytes,4,opt,name=summary" json:"summary,omitempty"` - Untyped *Untyped `protobuf:"bytes,5,opt,name=untyped" json:"untyped,omitempty"` - Histogram *Histogram `protobuf:"bytes,7,opt,name=histogram" json:"histogram,omitempty"` - TimestampMs *int64 `protobuf:"varint,6,opt,name=timestamp_ms,json=timestampMs" json:"timestamp_ms,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *Metric) Reset() { *m = Metric{} } -func (m *Metric) String() string { return proto.CompactTextString(m) } -func (*Metric) ProtoMessage() {} -func (*Metric) Descriptor() ([]byte, []int) { - return fileDescriptor_d1e5ddb18987a258, []int{10} + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Label []*LabelPair `protobuf:"bytes,1,rep,name=label" json:"label,omitempty"` + Gauge *Gauge `protobuf:"bytes,2,opt,name=gauge" json:"gauge,omitempty"` + Counter *Counter `protobuf:"bytes,3,opt,name=counter" json:"counter,omitempty"` + Summary *Summary `protobuf:"bytes,4,opt,name=summary" json:"summary,omitempty"` + Untyped *Untyped `protobuf:"bytes,5,opt,name=untyped" json:"untyped,omitempty"` + Histogram *Histogram `protobuf:"bytes,7,opt,name=histogram" json:"histogram,omitempty"` + TimestampMs *int64 `protobuf:"varint,6,opt,name=timestamp_ms,json=timestampMs" json:"timestamp_ms,omitempty"` +} + +func (x *Metric) Reset() { + *x = Metric{} + if protoimpl.UnsafeEnabled { + mi := &file_io_prometheus_client_metrics_proto_msgTypes[10] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } } -func (m *Metric) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_Metric.Unmarshal(m, b) +func (x *Metric) String() string { + return protoimpl.X.MessageStringOf(x) } -func (m *Metric) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_Metric.Marshal(b, m, deterministic) -} -func (m *Metric) XXX_Merge(src proto.Message) { - xxx_messageInfo_Metric.Merge(m, src) -} -func (m *Metric) XXX_Size() int { - return xxx_messageInfo_Metric.Size(m) -} -func (m *Metric) XXX_DiscardUnknown() { - xxx_messageInfo_Metric.DiscardUnknown(m) + +func (*Metric) ProtoMessage() {} + +func (x *Metric) ProtoReflect() protoreflect.Message { + mi := &file_io_prometheus_client_metrics_proto_msgTypes[10] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) } -var xxx_messageInfo_Metric proto.InternalMessageInfo +// Deprecated: Use Metric.ProtoReflect.Descriptor instead. +func (*Metric) Descriptor() ([]byte, []int) { + return file_io_prometheus_client_metrics_proto_rawDescGZIP(), []int{10} +} -func (m *Metric) GetLabel() []*LabelPair { - if m != nil { - return m.Label +func (x *Metric) GetLabel() []*LabelPair { + if x != nil { + return x.Label } return nil } -func (m *Metric) GetGauge() *Gauge { - if m != nil { - return m.Gauge +func (x *Metric) GetGauge() *Gauge { + if x != nil { + return x.Gauge } return nil } -func (m *Metric) GetCounter() *Counter { - if m != nil { - return m.Counter +func (x *Metric) GetCounter() *Counter { + if x != nil { + return x.Counter } return nil } -func (m *Metric) GetSummary() *Summary { - if m != nil { - return m.Summary +func (x *Metric) GetSummary() *Summary { + if x != nil { + return x.Summary } return nil } -func (m *Metric) GetUntyped() *Untyped { - if m != nil { - return m.Untyped +func (x *Metric) GetUntyped() *Untyped { + if x != nil { + return x.Untyped } return nil } -func (m *Metric) GetHistogram() *Histogram { - if m != nil { - return m.Histogram +func (x *Metric) GetHistogram() *Histogram { + if x != nil { + return x.Histogram } return nil } -func (m *Metric) GetTimestampMs() int64 { - if m != nil && m.TimestampMs != nil { - return *m.TimestampMs +func (x *Metric) GetTimestampMs() int64 { + if x != nil && x.TimestampMs != nil { + return *x.TimestampMs } return 0 } type MetricFamily struct { - Name *string `protobuf:"bytes,1,opt,name=name" json:"name,omitempty"` - Help *string `protobuf:"bytes,2,opt,name=help" json:"help,omitempty"` - Type *MetricType `protobuf:"varint,3,opt,name=type,enum=io.prometheus.client.MetricType" json:"type,omitempty"` - Metric []*Metric `protobuf:"bytes,4,rep,name=metric" json:"metric,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *MetricFamily) Reset() { *m = MetricFamily{} } -func (m *MetricFamily) String() string { return proto.CompactTextString(m) } -func (*MetricFamily) ProtoMessage() {} -func (*MetricFamily) Descriptor() ([]byte, []int) { - return fileDescriptor_d1e5ddb18987a258, []int{11} + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Name *string `protobuf:"bytes,1,opt,name=name" json:"name,omitempty"` + Help *string `protobuf:"bytes,2,opt,name=help" json:"help,omitempty"` + Type *MetricType `protobuf:"varint,3,opt,name=type,enum=io.prometheus.client.MetricType" json:"type,omitempty"` + Metric []*Metric `protobuf:"bytes,4,rep,name=metric" json:"metric,omitempty"` +} + +func (x *MetricFamily) Reset() { + *x = MetricFamily{} + if protoimpl.UnsafeEnabled { + mi := &file_io_prometheus_client_metrics_proto_msgTypes[11] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } } -func (m *MetricFamily) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_MetricFamily.Unmarshal(m, b) -} -func (m *MetricFamily) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_MetricFamily.Marshal(b, m, deterministic) -} -func (m *MetricFamily) XXX_Merge(src proto.Message) { - xxx_messageInfo_MetricFamily.Merge(m, src) -} -func (m *MetricFamily) XXX_Size() int { - return xxx_messageInfo_MetricFamily.Size(m) +func (x *MetricFamily) String() string { + return protoimpl.X.MessageStringOf(x) } -func (m *MetricFamily) XXX_DiscardUnknown() { - xxx_messageInfo_MetricFamily.DiscardUnknown(m) + +func (*MetricFamily) ProtoMessage() {} + +func (x *MetricFamily) ProtoReflect() protoreflect.Message { + mi := &file_io_prometheus_client_metrics_proto_msgTypes[11] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) } -var xxx_messageInfo_MetricFamily proto.InternalMessageInfo +// Deprecated: Use MetricFamily.ProtoReflect.Descriptor instead. +func (*MetricFamily) Descriptor() ([]byte, []int) { + return file_io_prometheus_client_metrics_proto_rawDescGZIP(), []int{11} +} -func (m *MetricFamily) GetName() string { - if m != nil && m.Name != nil { - return *m.Name +func (x *MetricFamily) GetName() string { + if x != nil && x.Name != nil { + return *x.Name } return "" } -func (m *MetricFamily) GetHelp() string { - if m != nil && m.Help != nil { - return *m.Help +func (x *MetricFamily) GetHelp() string { + if x != nil && x.Help != nil { + return *x.Help } return "" } -func (m *MetricFamily) GetType() MetricType { - if m != nil && m.Type != nil { - return *m.Type +func (x *MetricFamily) GetType() MetricType { + if x != nil && x.Type != nil { + return *x.Type } return MetricType_COUNTER } -func (m *MetricFamily) GetMetric() []*Metric { - if m != nil { - return m.Metric +func (x *MetricFamily) GetMetric() []*Metric { + if x != nil { + return x.Metric } return nil } -func init() { - proto.RegisterEnum("io.prometheus.client.MetricType", MetricType_name, MetricType_value) - proto.RegisterType((*LabelPair)(nil), "io.prometheus.client.LabelPair") - proto.RegisterType((*Gauge)(nil), "io.prometheus.client.Gauge") - proto.RegisterType((*Counter)(nil), "io.prometheus.client.Counter") - proto.RegisterType((*Quantile)(nil), "io.prometheus.client.Quantile") - proto.RegisterType((*Summary)(nil), "io.prometheus.client.Summary") - proto.RegisterType((*Untyped)(nil), "io.prometheus.client.Untyped") - proto.RegisterType((*Histogram)(nil), "io.prometheus.client.Histogram") - proto.RegisterType((*Bucket)(nil), "io.prometheus.client.Bucket") - proto.RegisterType((*BucketSpan)(nil), "io.prometheus.client.BucketSpan") - proto.RegisterType((*Exemplar)(nil), "io.prometheus.client.Exemplar") - proto.RegisterType((*Metric)(nil), "io.prometheus.client.Metric") - proto.RegisterType((*MetricFamily)(nil), "io.prometheus.client.MetricFamily") -} - -func init() { - proto.RegisterFile("io/prometheus/client/metrics.proto", fileDescriptor_d1e5ddb18987a258) -} - -var fileDescriptor_d1e5ddb18987a258 = []byte{ - // 896 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x9c, 0x56, 0xdd, 0x8e, 0xdb, 0x44, - 0x18, 0xc5, 0x9b, 0x5f, 0x7f, 0xd9, 0x6c, 0xd3, 0x61, 0x55, 0x59, 0x0b, 0xcb, 0x06, 0x4b, 0x48, - 0x0b, 0x42, 0x8e, 0x40, 0x5b, 0x81, 0x0a, 0x5c, 0xec, 0xb6, 0xe9, 0x16, 0x89, 0xb4, 0x65, 0x92, - 0x5c, 0x14, 0x2e, 0xac, 0x49, 0x32, 0xeb, 0x58, 0x78, 0x3c, 0xc6, 0x1e, 0x57, 0x2c, 0x2f, 0xc0, - 0x35, 0xaf, 0xc0, 0xc3, 0xf0, 0x22, 0x3c, 0x08, 0x68, 0xfe, 0xec, 0xdd, 0xe2, 0x94, 0xd2, 0x3b, - 0x7f, 0x67, 0xce, 0xf7, 0xcd, 0x39, 0xe3, 0xc9, 0x71, 0xc0, 0x8f, 0xf9, 0x24, 0xcb, 0x39, 0xa3, - 0x62, 0x4b, 0xcb, 0x62, 0xb2, 0x4e, 0x62, 0x9a, 0x8a, 0x09, 0xa3, 0x22, 0x8f, 0xd7, 0x45, 0x90, - 0xe5, 0x5c, 0x70, 0x74, 0x18, 0xf3, 0xa0, 0xe6, 0x04, 0x9a, 0x73, 0x74, 0x12, 0x71, 0x1e, 0x25, - 0x74, 0xa2, 0x38, 0xab, 0xf2, 0x6a, 0x22, 0x62, 0x46, 0x0b, 0x41, 0x58, 0xa6, 0xdb, 0xfc, 0xfb, - 0xe0, 0x7e, 0x47, 0x56, 0x34, 0x79, 0x4e, 0xe2, 0x1c, 0x21, 0x68, 0xa7, 0x84, 0x51, 0xcf, 0x19, - 0x3b, 0xa7, 0x2e, 0x56, 0xcf, 0xe8, 0x10, 0x3a, 0x2f, 0x49, 0x52, 0x52, 0x6f, 0x4f, 0x81, 0xba, - 0xf0, 0x8f, 0xa1, 0x73, 0x49, 0xca, 0xe8, 0xc6, 0xb2, 0xec, 0x71, 0xec, 0xf2, 0x8f, 0xd0, 0x7b, - 0xc8, 0xcb, 0x54, 0xd0, 0xbc, 0x99, 0x80, 0x1e, 0x40, 0x9f, 0xfe, 0x42, 0x59, 0x96, 0x90, 0x5c, - 0x0d, 0x1e, 0x7c, 0xfe, 0x41, 0xd0, 0x64, 0x20, 0x98, 0x1a, 0x16, 0xae, 0xf8, 0xfe, 0xd7, 0xd0, - 0xff, 0xbe, 0x24, 0xa9, 0x88, 0x13, 0x8a, 0x8e, 0xa0, 0xff, 0xb3, 0x79, 0x36, 0x1b, 0x54, 0xf5, - 0x6d, 0xe5, 0x95, 0xb4, 0xdf, 0x1c, 0xe8, 0xcd, 0x4b, 0xc6, 0x48, 0x7e, 0x8d, 0x3e, 0x84, 0xfd, - 0x82, 0xb0, 0x2c, 0xa1, 0xe1, 0x5a, 0xaa, 0x55, 0x13, 0xda, 0x78, 0xa0, 0x31, 0x65, 0x00, 0x1d, - 0x03, 0x18, 0x4a, 0x51, 0x32, 0x33, 0xc9, 0xd5, 0xc8, 0xbc, 0x64, 0xd2, 0x47, 0xb5, 0x7f, 0x6b, - 0xdc, 0xda, 0xed, 0xc3, 0x2a, 0xae, 0xf5, 0xf9, 0x27, 0xd0, 0x5b, 0xa6, 0xe2, 0x3a, 0xa3, 0x9b, - 0x1d, 0xa7, 0xf8, 0x57, 0x1b, 0xdc, 0x27, 0x71, 0x21, 0x78, 0x94, 0x13, 0xf6, 0x26, 0x62, 0x3f, - 0x05, 0x74, 0x93, 0x12, 0x5e, 0x25, 0x9c, 0x08, 0xaf, 0xad, 0x66, 0x8e, 0x6e, 0x10, 0x1f, 0x4b, - 0xfc, 0xbf, 0xac, 0x9d, 0x41, 0x77, 0x55, 0xae, 0x7f, 0xa2, 0xc2, 0x18, 0x7b, 0xbf, 0xd9, 0xd8, - 0x85, 0xe2, 0x60, 0xc3, 0x45, 0xf7, 0xa0, 0x5b, 0xac, 0xb7, 0x94, 0x11, 0xaf, 0x33, 0x76, 0x4e, - 0xef, 0x62, 0x53, 0xa1, 0x8f, 0xe0, 0xe0, 0x57, 0x9a, 0xf3, 0x50, 0x6c, 0x73, 0x5a, 0x6c, 0x79, - 0xb2, 0xf1, 0xba, 0x6a, 0xc3, 0xa1, 0x44, 0x17, 0x16, 0x94, 0x9a, 0x14, 0x4d, 0x5b, 0xec, 0x29, - 0x8b, 0xae, 0x44, 0xb4, 0xc1, 0x53, 0x18, 0xd5, 0xcb, 0xc6, 0x5e, 0x5f, 0xcd, 0x39, 0xa8, 0x48, - 0xda, 0xdc, 0x14, 0x86, 0x29, 0x8d, 0x88, 0x88, 0x5f, 0xd2, 0xb0, 0xc8, 0x48, 0xea, 0xb9, 0xca, - 0xc4, 0xf8, 0x75, 0x26, 0xe6, 0x19, 0x49, 0xf1, 0xbe, 0x6d, 0x93, 0x95, 0x94, 0x5d, 0x8d, 0xd9, - 0xd0, 0x44, 0x10, 0x0f, 0xc6, 0xad, 0x53, 0x84, 0xab, 0xe1, 0x8f, 0x24, 0x78, 0x8b, 0xa6, 0xa5, - 0x0f, 0xc6, 0x2d, 0xe9, 0xce, 0xa2, 0x5a, 0xfe, 0x14, 0x86, 0x19, 0x2f, 0xe2, 0x5a, 0xd4, 0xfe, - 0x9b, 0x8a, 0xb2, 0x6d, 0x56, 0x54, 0x35, 0x46, 0x8b, 0x1a, 0x6a, 0x51, 0x16, 0xad, 0x44, 0x55, - 0x34, 0x2d, 0xea, 0x40, 0x8b, 0xb2, 0xa8, 0x12, 0xe5, 0xff, 0xe9, 0x40, 0x57, 0x6f, 0x85, 0x3e, - 0x86, 0xd1, 0xba, 0x64, 0x65, 0x72, 0xd3, 0x88, 0xbe, 0x66, 0x77, 0x6a, 0x5c, 0x5b, 0x39, 0x83, - 0x7b, 0xaf, 0x52, 0x6f, 0x5d, 0xb7, 0xc3, 0x57, 0x1a, 0xf4, 0x5b, 0x39, 0x81, 0x41, 0x99, 0x65, - 0x34, 0x0f, 0x57, 0xbc, 0x4c, 0x37, 0xe6, 0xce, 0x81, 0x82, 0x2e, 0x24, 0x72, 0x2b, 0x17, 0x5a, - 0xff, 0x3b, 0x17, 0xa0, 0x3e, 0x32, 0x79, 0x11, 0xf9, 0xd5, 0x55, 0x41, 0xb5, 0x83, 0xbb, 0xd8, - 0x54, 0x12, 0x4f, 0x68, 0x1a, 0x89, 0xad, 0xda, 0x7d, 0x88, 0x4d, 0xe5, 0xff, 0xee, 0x40, 0xdf, - 0x0e, 0x45, 0xf7, 0xa1, 0x93, 0xc8, 0x54, 0xf4, 0x1c, 0xf5, 0x82, 0x4e, 0x9a, 0x35, 0x54, 0xc1, - 0x89, 0x35, 0xbb, 0x39, 0x71, 0xd0, 0x97, 0xe0, 0x56, 0xa9, 0x6b, 0x4c, 0x1d, 0x05, 0x3a, 0x97, - 0x03, 0x9b, 0xcb, 0xc1, 0xc2, 0x32, 0x70, 0x4d, 0xf6, 0xff, 0xde, 0x83, 0xee, 0x4c, 0xa5, 0xfc, - 0xdb, 0x2a, 0xfa, 0x0c, 0x3a, 0x91, 0xcc, 0x69, 0x13, 0xb2, 0xef, 0x35, 0xb7, 0xa9, 0x28, 0xc7, - 0x9a, 0x89, 0xbe, 0x80, 0xde, 0x5a, 0x67, 0xb7, 0x11, 0x7b, 0xdc, 0xdc, 0x64, 0x02, 0x1e, 0x5b, - 0xb6, 0x6c, 0x2c, 0x74, 0xb0, 0xaa, 0x3b, 0xb0, 0xb3, 0xd1, 0xa4, 0x2f, 0xb6, 0x6c, 0xd9, 0x58, - 0xea, 0x20, 0x54, 0xa1, 0xb1, 0xb3, 0xd1, 0xa4, 0x25, 0xb6, 0x6c, 0xf4, 0x0d, 0xb8, 0x5b, 0x9b, - 0x8f, 0x2a, 0x2c, 0x76, 0x1e, 0x4c, 0x15, 0xa3, 0xb8, 0xee, 0x90, 0x89, 0x5a, 0x9d, 0x75, 0xc8, - 0x0a, 0x95, 0x48, 0x2d, 0x3c, 0xa8, 0xb0, 0x59, 0xe1, 0xff, 0xe1, 0xc0, 0xbe, 0x7e, 0x03, 0x8f, - 0x09, 0x8b, 0x93, 0xeb, 0xc6, 0x4f, 0x24, 0x82, 0xf6, 0x96, 0x26, 0x99, 0xf9, 0x42, 0xaa, 0x67, - 0x74, 0x06, 0x6d, 0xa9, 0x51, 0x1d, 0xe1, 0xc1, 0xae, 0x5f, 0xb8, 0x9e, 0xbc, 0xb8, 0xce, 0x28, - 0x56, 0x6c, 0x99, 0xb9, 0xfa, 0xab, 0xee, 0xb5, 0x5f, 0x97, 0xb9, 0xba, 0x0f, 0x1b, 0xee, 0x27, - 0x2b, 0x80, 0x7a, 0x12, 0x1a, 0x40, 0xef, 0xe1, 0xb3, 0xe5, 0xd3, 0xc5, 0x14, 0x8f, 0xde, 0x41, - 0x2e, 0x74, 0x2e, 0xcf, 0x97, 0x97, 0xd3, 0x91, 0x23, 0xf1, 0xf9, 0x72, 0x36, 0x3b, 0xc7, 0x2f, - 0x46, 0x7b, 0xb2, 0x58, 0x3e, 0x5d, 0xbc, 0x78, 0x3e, 0x7d, 0x34, 0x6a, 0xa1, 0x21, 0xb8, 0x4f, - 0xbe, 0x9d, 0x2f, 0x9e, 0x5d, 0xe2, 0xf3, 0xd9, 0xa8, 0x8d, 0xde, 0x85, 0x3b, 0xaa, 0x27, 0xac, - 0xc1, 0xce, 0x05, 0x86, 0xc6, 0x3f, 0x18, 0x3f, 0x3c, 0x88, 0x62, 0xb1, 0x2d, 0x57, 0xc1, 0x9a, - 0xb3, 0x7f, 0xff, 0x45, 0x09, 0x19, 0xdf, 0xd0, 0x64, 0x12, 0xf1, 0xaf, 0x62, 0x1e, 0xd6, 0xab, - 0xa1, 0x5e, 0xfd, 0x27, 0x00, 0x00, 0xff, 0xff, 0x16, 0x77, 0x81, 0x98, 0xd7, 0x08, 0x00, 0x00, +var File_io_prometheus_client_metrics_proto protoreflect.FileDescriptor + +var file_io_prometheus_client_metrics_proto_rawDesc = []byte{ + 0x0a, 0x22, 0x69, 0x6f, 0x2f, 0x70, 0x72, 0x6f, 0x6d, 0x65, 0x74, 0x68, 0x65, 0x75, 0x73, 0x2f, + 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x2f, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x2e, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x14, 0x69, 0x6f, 0x2e, 0x70, 0x72, 0x6f, 0x6d, 0x65, 0x74, 0x68, + 0x65, 0x75, 0x73, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x1a, 0x1f, 0x67, 0x6f, 0x6f, 0x67, + 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x74, 0x69, 0x6d, 0x65, + 0x73, 0x74, 0x61, 0x6d, 0x70, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x35, 0x0a, 0x09, 0x4c, + 0x61, 0x62, 0x65, 0x6c, 0x50, 0x61, 0x69, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x14, 0x0a, 0x05, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x22, 0x1d, 0x0a, 0x05, 0x47, 0x61, 0x75, 0x67, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x01, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x22, 0x5b, 0x0a, 0x07, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x12, 0x14, 0x0a, 0x05, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x01, 0x52, 0x05, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x12, 0x3a, 0x0a, 0x08, 0x65, 0x78, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x72, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x69, 0x6f, 0x2e, 0x70, 0x72, 0x6f, 0x6d, 0x65, 0x74, + 0x68, 0x65, 0x75, 0x73, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x2e, 0x45, 0x78, 0x65, 0x6d, + 0x70, 0x6c, 0x61, 0x72, 0x52, 0x08, 0x65, 0x78, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x72, 0x22, 0x3c, + 0x0a, 0x08, 0x51, 0x75, 0x61, 0x6e, 0x74, 0x69, 0x6c, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x71, 0x75, + 0x61, 0x6e, 0x74, 0x69, 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x01, 0x52, 0x08, 0x71, 0x75, + 0x61, 0x6e, 0x74, 0x69, 0x6c, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x01, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x87, 0x01, 0x0a, + 0x07, 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x12, 0x21, 0x0a, 0x0c, 0x73, 0x61, 0x6d, 0x70, + 0x6c, 0x65, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0b, + 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x73, + 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x5f, 0x73, 0x75, 0x6d, 0x18, 0x02, 0x20, 0x01, 0x28, 0x01, 0x52, + 0x09, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x53, 0x75, 0x6d, 0x12, 0x3a, 0x0a, 0x08, 0x71, 0x75, + 0x61, 0x6e, 0x74, 0x69, 0x6c, 0x65, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x69, + 0x6f, 0x2e, 0x70, 0x72, 0x6f, 0x6d, 0x65, 0x74, 0x68, 0x65, 0x75, 0x73, 0x2e, 0x63, 0x6c, 0x69, + 0x65, 0x6e, 0x74, 0x2e, 0x51, 0x75, 0x61, 0x6e, 0x74, 0x69, 0x6c, 0x65, 0x52, 0x08, 0x71, 0x75, + 0x61, 0x6e, 0x74, 0x69, 0x6c, 0x65, 0x22, 0x1f, 0x0a, 0x07, 0x55, 0x6e, 0x74, 0x79, 0x70, 0x65, + 0x64, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x01, + 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0xe3, 0x04, 0x0a, 0x09, 0x48, 0x69, 0x73, 0x74, + 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x12, 0x21, 0x0a, 0x0c, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x5f, + 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0b, 0x73, 0x61, 0x6d, + 0x70, 0x6c, 0x65, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x2c, 0x0a, 0x12, 0x73, 0x61, 0x6d, 0x70, + 0x6c, 0x65, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x5f, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x18, 0x04, + 0x20, 0x01, 0x28, 0x01, 0x52, 0x10, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x43, 0x6f, 0x75, 0x6e, + 0x74, 0x46, 0x6c, 0x6f, 0x61, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, + 0x5f, 0x73, 0x75, 0x6d, 0x18, 0x02, 0x20, 0x01, 0x28, 0x01, 0x52, 0x09, 0x73, 0x61, 0x6d, 0x70, + 0x6c, 0x65, 0x53, 0x75, 0x6d, 0x12, 0x34, 0x0a, 0x06, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x18, + 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x69, 0x6f, 0x2e, 0x70, 0x72, 0x6f, 0x6d, 0x65, + 0x74, 0x68, 0x65, 0x75, 0x73, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x2e, 0x42, 0x75, 0x63, + 0x6b, 0x65, 0x74, 0x52, 0x06, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x18, 0x05, 0x20, 0x01, 0x28, 0x11, 0x52, 0x06, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x12, 0x25, 0x0a, 0x0e, 0x7a, 0x65, 0x72, 0x6f, 0x5f, 0x74, 0x68, 0x72, 0x65, + 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x01, 0x52, 0x0d, 0x7a, 0x65, 0x72, + 0x6f, 0x54, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x7a, 0x65, + 0x72, 0x6f, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x04, 0x52, 0x09, + 0x7a, 0x65, 0x72, 0x6f, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x28, 0x0a, 0x10, 0x7a, 0x65, 0x72, + 0x6f, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x5f, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x18, 0x08, 0x20, + 0x01, 0x28, 0x01, 0x52, 0x0e, 0x7a, 0x65, 0x72, 0x6f, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x46, 0x6c, + 0x6f, 0x61, 0x74, 0x12, 0x45, 0x0a, 0x0d, 0x6e, 0x65, 0x67, 0x61, 0x74, 0x69, 0x76, 0x65, 0x5f, + 0x73, 0x70, 0x61, 0x6e, 0x18, 0x09, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x69, 0x6f, 0x2e, + 0x70, 0x72, 0x6f, 0x6d, 0x65, 0x74, 0x68, 0x65, 0x75, 0x73, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, + 0x74, 0x2e, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x53, 0x70, 0x61, 0x6e, 0x52, 0x0c, 0x6e, 0x65, + 0x67, 0x61, 0x74, 0x69, 0x76, 0x65, 0x53, 0x70, 0x61, 0x6e, 0x12, 0x25, 0x0a, 0x0e, 0x6e, 0x65, + 0x67, 0x61, 0x74, 0x69, 0x76, 0x65, 0x5f, 0x64, 0x65, 0x6c, 0x74, 0x61, 0x18, 0x0a, 0x20, 0x03, + 0x28, 0x12, 0x52, 0x0d, 0x6e, 0x65, 0x67, 0x61, 0x74, 0x69, 0x76, 0x65, 0x44, 0x65, 0x6c, 0x74, + 0x61, 0x12, 0x25, 0x0a, 0x0e, 0x6e, 0x65, 0x67, 0x61, 0x74, 0x69, 0x76, 0x65, 0x5f, 0x63, 0x6f, + 0x75, 0x6e, 0x74, 0x18, 0x0b, 0x20, 0x03, 0x28, 0x01, 0x52, 0x0d, 0x6e, 0x65, 0x67, 0x61, 0x74, + 0x69, 0x76, 0x65, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x45, 0x0a, 0x0d, 0x70, 0x6f, 0x73, 0x69, + 0x74, 0x69, 0x76, 0x65, 0x5f, 0x73, 0x70, 0x61, 0x6e, 0x18, 0x0c, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x20, 0x2e, 0x69, 0x6f, 0x2e, 0x70, 0x72, 0x6f, 0x6d, 0x65, 0x74, 0x68, 0x65, 0x75, 0x73, 0x2e, + 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x2e, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x53, 0x70, 0x61, + 0x6e, 0x52, 0x0c, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x76, 0x65, 0x53, 0x70, 0x61, 0x6e, 0x12, + 0x25, 0x0a, 0x0e, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x76, 0x65, 0x5f, 0x64, 0x65, 0x6c, 0x74, + 0x61, 0x18, 0x0d, 0x20, 0x03, 0x28, 0x12, 0x52, 0x0d, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x76, + 0x65, 0x44, 0x65, 0x6c, 0x74, 0x61, 0x12, 0x25, 0x0a, 0x0e, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, + 0x76, 0x65, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x0e, 0x20, 0x03, 0x28, 0x01, 0x52, 0x0d, + 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x76, 0x65, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0xc6, 0x01, + 0x0a, 0x06, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x12, 0x29, 0x0a, 0x10, 0x63, 0x75, 0x6d, 0x75, + 0x6c, 0x61, 0x74, 0x69, 0x76, 0x65, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x04, 0x52, 0x0f, 0x63, 0x75, 0x6d, 0x75, 0x6c, 0x61, 0x74, 0x69, 0x76, 0x65, 0x43, 0x6f, + 0x75, 0x6e, 0x74, 0x12, 0x34, 0x0a, 0x16, 0x63, 0x75, 0x6d, 0x75, 0x6c, 0x61, 0x74, 0x69, 0x76, + 0x65, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x5f, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x18, 0x04, 0x20, + 0x01, 0x28, 0x01, 0x52, 0x14, 0x63, 0x75, 0x6d, 0x75, 0x6c, 0x61, 0x74, 0x69, 0x76, 0x65, 0x43, + 0x6f, 0x75, 0x6e, 0x74, 0x46, 0x6c, 0x6f, 0x61, 0x74, 0x12, 0x1f, 0x0a, 0x0b, 0x75, 0x70, 0x70, + 0x65, 0x72, 0x5f, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x01, 0x52, 0x0a, + 0x75, 0x70, 0x70, 0x65, 0x72, 0x42, 0x6f, 0x75, 0x6e, 0x64, 0x12, 0x3a, 0x0a, 0x08, 0x65, 0x78, + 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x69, + 0x6f, 0x2e, 0x70, 0x72, 0x6f, 0x6d, 0x65, 0x74, 0x68, 0x65, 0x75, 0x73, 0x2e, 0x63, 0x6c, 0x69, + 0x65, 0x6e, 0x74, 0x2e, 0x45, 0x78, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x72, 0x52, 0x08, 0x65, 0x78, + 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x72, 0x22, 0x3c, 0x0a, 0x0a, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, + 0x53, 0x70, 0x61, 0x6e, 0x12, 0x16, 0x0a, 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x11, 0x52, 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x12, 0x16, 0x0a, 0x06, + 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x06, 0x6c, 0x65, + 0x6e, 0x67, 0x74, 0x68, 0x22, 0x91, 0x01, 0x0a, 0x08, 0x45, 0x78, 0x65, 0x6d, 0x70, 0x6c, 0x61, + 0x72, 0x12, 0x35, 0x0a, 0x05, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x1f, 0x2e, 0x69, 0x6f, 0x2e, 0x70, 0x72, 0x6f, 0x6d, 0x65, 0x74, 0x68, 0x65, 0x75, 0x73, + 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x2e, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x50, 0x61, 0x69, + 0x72, 0x52, 0x05, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x01, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x38, + 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x74, + 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x22, 0xff, 0x02, 0x0a, 0x06, 0x4d, 0x65, 0x74, + 0x72, 0x69, 0x63, 0x12, 0x35, 0x0a, 0x05, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x18, 0x01, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x69, 0x6f, 0x2e, 0x70, 0x72, 0x6f, 0x6d, 0x65, 0x74, 0x68, 0x65, + 0x75, 0x73, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x2e, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x50, + 0x61, 0x69, 0x72, 0x52, 0x05, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x12, 0x31, 0x0a, 0x05, 0x67, 0x61, + 0x75, 0x67, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x69, 0x6f, 0x2e, 0x70, + 0x72, 0x6f, 0x6d, 0x65, 0x74, 0x68, 0x65, 0x75, 0x73, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, + 0x2e, 0x47, 0x61, 0x75, 0x67, 0x65, 0x52, 0x05, 0x67, 0x61, 0x75, 0x67, 0x65, 0x12, 0x37, 0x0a, + 0x07, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, + 0x2e, 0x69, 0x6f, 0x2e, 0x70, 0x72, 0x6f, 0x6d, 0x65, 0x74, 0x68, 0x65, 0x75, 0x73, 0x2e, 0x63, + 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x2e, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x52, 0x07, 0x63, + 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x12, 0x37, 0x0a, 0x07, 0x73, 0x75, 0x6d, 0x6d, 0x61, 0x72, + 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6f, 0x2e, 0x70, 0x72, 0x6f, + 0x6d, 0x65, 0x74, 0x68, 0x65, 0x75, 0x73, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x2e, 0x53, + 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x52, 0x07, 0x73, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x12, + 0x37, 0x0a, 0x07, 0x75, 0x6e, 0x74, 0x79, 0x70, 0x65, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x1d, 0x2e, 0x69, 0x6f, 0x2e, 0x70, 0x72, 0x6f, 0x6d, 0x65, 0x74, 0x68, 0x65, 0x75, 0x73, + 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x2e, 0x55, 0x6e, 0x74, 0x79, 0x70, 0x65, 0x64, 0x52, + 0x07, 0x75, 0x6e, 0x74, 0x79, 0x70, 0x65, 0x64, 0x12, 0x3d, 0x0a, 0x09, 0x68, 0x69, 0x73, 0x74, + 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x69, 0x6f, + 0x2e, 0x70, 0x72, 0x6f, 0x6d, 0x65, 0x74, 0x68, 0x65, 0x75, 0x73, 0x2e, 0x63, 0x6c, 0x69, 0x65, + 0x6e, 0x74, 0x2e, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x52, 0x09, 0x68, 0x69, + 0x73, 0x74, 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x12, 0x21, 0x0a, 0x0c, 0x74, 0x69, 0x6d, 0x65, 0x73, + 0x74, 0x61, 0x6d, 0x70, 0x5f, 0x6d, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0b, 0x74, + 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x4d, 0x73, 0x22, 0xa2, 0x01, 0x0a, 0x0c, 0x4d, + 0x65, 0x74, 0x72, 0x69, 0x63, 0x46, 0x61, 0x6d, 0x69, 0x6c, 0x79, 0x12, 0x12, 0x0a, 0x04, 0x6e, + 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, + 0x12, 0x0a, 0x04, 0x68, 0x65, 0x6c, 0x70, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x68, + 0x65, 0x6c, 0x70, 0x12, 0x34, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x0e, 0x32, 0x20, 0x2e, 0x69, 0x6f, 0x2e, 0x70, 0x72, 0x6f, 0x6d, 0x65, 0x74, 0x68, 0x65, 0x75, + 0x73, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x2e, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x54, + 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x34, 0x0a, 0x06, 0x6d, 0x65, 0x74, + 0x72, 0x69, 0x63, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x69, 0x6f, 0x2e, 0x70, + 0x72, 0x6f, 0x6d, 0x65, 0x74, 0x68, 0x65, 0x75, 0x73, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, + 0x2e, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x52, 0x06, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x2a, + 0x62, 0x0a, 0x0a, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x54, 0x79, 0x70, 0x65, 0x12, 0x0b, 0x0a, + 0x07, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x45, 0x52, 0x10, 0x00, 0x12, 0x09, 0x0a, 0x05, 0x47, 0x41, + 0x55, 0x47, 0x45, 0x10, 0x01, 0x12, 0x0b, 0x0a, 0x07, 0x53, 0x55, 0x4d, 0x4d, 0x41, 0x52, 0x59, + 0x10, 0x02, 0x12, 0x0b, 0x0a, 0x07, 0x55, 0x4e, 0x54, 0x59, 0x50, 0x45, 0x44, 0x10, 0x03, 0x12, + 0x0d, 0x0a, 0x09, 0x48, 0x49, 0x53, 0x54, 0x4f, 0x47, 0x52, 0x41, 0x4d, 0x10, 0x04, 0x12, 0x13, + 0x0a, 0x0f, 0x47, 0x41, 0x55, 0x47, 0x45, 0x5f, 0x48, 0x49, 0x53, 0x54, 0x4f, 0x47, 0x52, 0x41, + 0x4d, 0x10, 0x05, 0x42, 0x52, 0x0a, 0x14, 0x69, 0x6f, 0x2e, 0x70, 0x72, 0x6f, 0x6d, 0x65, 0x74, + 0x68, 0x65, 0x75, 0x73, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x5a, 0x3a, 0x67, 0x69, 0x74, + 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x70, 0x72, 0x6f, 0x6d, 0x65, 0x74, 0x68, 0x65, + 0x75, 0x73, 0x2f, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2f, + 0x67, 0x6f, 0x3b, 0x69, 0x6f, 0x5f, 0x70, 0x72, 0x6f, 0x6d, 0x65, 0x74, 0x68, 0x65, 0x75, 0x73, + 0x5f, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, +} + +var ( + file_io_prometheus_client_metrics_proto_rawDescOnce sync.Once + file_io_prometheus_client_metrics_proto_rawDescData = file_io_prometheus_client_metrics_proto_rawDesc +) + +func file_io_prometheus_client_metrics_proto_rawDescGZIP() []byte { + file_io_prometheus_client_metrics_proto_rawDescOnce.Do(func() { + file_io_prometheus_client_metrics_proto_rawDescData = protoimpl.X.CompressGZIP(file_io_prometheus_client_metrics_proto_rawDescData) + }) + return file_io_prometheus_client_metrics_proto_rawDescData +} + +var file_io_prometheus_client_metrics_proto_enumTypes = make([]protoimpl.EnumInfo, 1) +var file_io_prometheus_client_metrics_proto_msgTypes = make([]protoimpl.MessageInfo, 12) +var file_io_prometheus_client_metrics_proto_goTypes = []interface{}{ + (MetricType)(0), // 0: io.prometheus.client.MetricType + (*LabelPair)(nil), // 1: io.prometheus.client.LabelPair + (*Gauge)(nil), // 2: io.prometheus.client.Gauge + (*Counter)(nil), // 3: io.prometheus.client.Counter + (*Quantile)(nil), // 4: io.prometheus.client.Quantile + (*Summary)(nil), // 5: io.prometheus.client.Summary + (*Untyped)(nil), // 6: io.prometheus.client.Untyped + (*Histogram)(nil), // 7: io.prometheus.client.Histogram + (*Bucket)(nil), // 8: io.prometheus.client.Bucket + (*BucketSpan)(nil), // 9: io.prometheus.client.BucketSpan + (*Exemplar)(nil), // 10: io.prometheus.client.Exemplar + (*Metric)(nil), // 11: io.prometheus.client.Metric + (*MetricFamily)(nil), // 12: io.prometheus.client.MetricFamily + (*timestamppb.Timestamp)(nil), // 13: google.protobuf.Timestamp +} +var file_io_prometheus_client_metrics_proto_depIdxs = []int32{ + 10, // 0: io.prometheus.client.Counter.exemplar:type_name -> io.prometheus.client.Exemplar + 4, // 1: io.prometheus.client.Summary.quantile:type_name -> io.prometheus.client.Quantile + 8, // 2: io.prometheus.client.Histogram.bucket:type_name -> io.prometheus.client.Bucket + 9, // 3: io.prometheus.client.Histogram.negative_span:type_name -> io.prometheus.client.BucketSpan + 9, // 4: io.prometheus.client.Histogram.positive_span:type_name -> io.prometheus.client.BucketSpan + 10, // 5: io.prometheus.client.Bucket.exemplar:type_name -> io.prometheus.client.Exemplar + 1, // 6: io.prometheus.client.Exemplar.label:type_name -> io.prometheus.client.LabelPair + 13, // 7: io.prometheus.client.Exemplar.timestamp:type_name -> google.protobuf.Timestamp + 1, // 8: io.prometheus.client.Metric.label:type_name -> io.prometheus.client.LabelPair + 2, // 9: io.prometheus.client.Metric.gauge:type_name -> io.prometheus.client.Gauge + 3, // 10: io.prometheus.client.Metric.counter:type_name -> io.prometheus.client.Counter + 5, // 11: io.prometheus.client.Metric.summary:type_name -> io.prometheus.client.Summary + 6, // 12: io.prometheus.client.Metric.untyped:type_name -> io.prometheus.client.Untyped + 7, // 13: io.prometheus.client.Metric.histogram:type_name -> io.prometheus.client.Histogram + 0, // 14: io.prometheus.client.MetricFamily.type:type_name -> io.prometheus.client.MetricType + 11, // 15: io.prometheus.client.MetricFamily.metric:type_name -> io.prometheus.client.Metric + 16, // [16:16] is the sub-list for method output_type + 16, // [16:16] is the sub-list for method input_type + 16, // [16:16] is the sub-list for extension type_name + 16, // [16:16] is the sub-list for extension extendee + 0, // [0:16] is the sub-list for field type_name +} + +func init() { file_io_prometheus_client_metrics_proto_init() } +func file_io_prometheus_client_metrics_proto_init() { + if File_io_prometheus_client_metrics_proto != nil { + return + } + if !protoimpl.UnsafeEnabled { + file_io_prometheus_client_metrics_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*LabelPair); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_io_prometheus_client_metrics_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Gauge); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_io_prometheus_client_metrics_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Counter); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_io_prometheus_client_metrics_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Quantile); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_io_prometheus_client_metrics_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Summary); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_io_prometheus_client_metrics_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Untyped); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_io_prometheus_client_metrics_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Histogram); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_io_prometheus_client_metrics_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Bucket); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_io_prometheus_client_metrics_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*BucketSpan); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_io_prometheus_client_metrics_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Exemplar); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_io_prometheus_client_metrics_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Metric); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_io_prometheus_client_metrics_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*MetricFamily); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + } + type x struct{} + out := protoimpl.TypeBuilder{ + File: protoimpl.DescBuilder{ + GoPackagePath: reflect.TypeOf(x{}).PkgPath(), + RawDescriptor: file_io_prometheus_client_metrics_proto_rawDesc, + NumEnums: 1, + NumMessages: 12, + NumExtensions: 0, + NumServices: 0, + }, + GoTypes: file_io_prometheus_client_metrics_proto_goTypes, + DependencyIndexes: file_io_prometheus_client_metrics_proto_depIdxs, + EnumInfos: file_io_prometheus_client_metrics_proto_enumTypes, + MessageInfos: file_io_prometheus_client_metrics_proto_msgTypes, + }.Build() + File_io_prometheus_client_metrics_proto = out.File + file_io_prometheus_client_metrics_proto_rawDesc = nil + file_io_prometheus_client_metrics_proto_goTypes = nil + file_io_prometheus_client_metrics_proto_depIdxs = nil } diff --git a/vendor/github.com/prometheus/common/expfmt/decode.go b/vendor/github.com/prometheus/common/expfmt/decode.go index 7657f841d632..906397815138 100644 --- a/vendor/github.com/prometheus/common/expfmt/decode.go +++ b/vendor/github.com/prometheus/common/expfmt/decode.go @@ -115,32 +115,31 @@ func (d *protoDecoder) Decode(v *dto.MetricFamily) error { // textDecoder implements the Decoder interface for the text protocol. type textDecoder struct { r io.Reader - p TextParser - fams []*dto.MetricFamily + fams map[string]*dto.MetricFamily + err error } // Decode implements the Decoder interface. func (d *textDecoder) Decode(v *dto.MetricFamily) error { - // TODO(fabxc): Wrap this as a line reader to make streaming safer. - if len(d.fams) == 0 { - // No cached metric families, read everything and parse metrics. - fams, err := d.p.TextToMetricFamilies(d.r) - if err != nil { - return err - } - if len(fams) == 0 { - return io.EOF - } - d.fams = make([]*dto.MetricFamily, 0, len(fams)) - for _, f := range fams { - d.fams = append(d.fams, f) + if d.err == nil { + // Read all metrics in one shot. + var p TextParser + d.fams, d.err = p.TextToMetricFamilies(d.r) + // If we don't get an error, store io.EOF for the end. + if d.err == nil { + d.err = io.EOF } } - - *v = *d.fams[0] - d.fams = d.fams[1:] - - return nil + // Pick off one MetricFamily per Decode until there's nothing left. + for key, fam := range d.fams { + v.Name = fam.Name + v.Help = fam.Help + v.Type = fam.Type + v.Metric = fam.Metric + delete(d.fams, key) + return nil + } + return d.err } // SampleDecoder wraps a Decoder to extract samples from the metric families diff --git a/vendor/github.com/prometheus/common/expfmt/encode.go b/vendor/github.com/prometheus/common/expfmt/encode.go index 64dc0eb40c28..7f611ffaad7c 100644 --- a/vendor/github.com/prometheus/common/expfmt/encode.go +++ b/vendor/github.com/prometheus/common/expfmt/encode.go @@ -18,9 +18,9 @@ import ( "io" "net/http" - "github.com/golang/protobuf/proto" //nolint:staticcheck // Ignore SA1019. Need to keep deprecated package for compatibility. "github.com/matttproud/golang_protobuf_extensions/pbutil" "github.com/prometheus/common/internal/bitbucket.org/ww/goautoneg" + "google.golang.org/protobuf/encoding/prototext" dto "github.com/prometheus/client_model/go" ) @@ -99,8 +99,11 @@ func NegotiateIncludingOpenMetrics(h http.Header) Format { if ac.Type == "text" && ac.SubType == "plain" && (ver == TextVersion || ver == "") { return FmtText } - if ac.Type+"/"+ac.SubType == OpenMetricsType && (ver == OpenMetricsVersion || ver == "") { - return FmtOpenMetrics + if ac.Type+"/"+ac.SubType == OpenMetricsType && (ver == OpenMetricsVersion_0_0_1 || ver == OpenMetricsVersion_1_0_0 || ver == "") { + if ver == OpenMetricsVersion_1_0_0 { + return FmtOpenMetrics_1_0_0 + } + return FmtOpenMetrics_0_0_1 } } return FmtText @@ -133,7 +136,7 @@ func NewEncoder(w io.Writer, format Format) Encoder { case FmtProtoText: return encoderCloser{ encode: func(v *dto.MetricFamily) error { - _, err := fmt.Fprintln(w, proto.MarshalTextString(v)) + _, err := fmt.Fprintln(w, prototext.Format(v)) return err }, close: func() error { return nil }, @@ -146,7 +149,7 @@ func NewEncoder(w io.Writer, format Format) Encoder { }, close: func() error { return nil }, } - case FmtOpenMetrics: + case FmtOpenMetrics_0_0_1, FmtOpenMetrics_1_0_0: return encoderCloser{ encode: func(v *dto.MetricFamily) error { _, err := MetricFamilyToOpenMetrics(w, v) diff --git a/vendor/github.com/prometheus/common/expfmt/expfmt.go b/vendor/github.com/prometheus/common/expfmt/expfmt.go index 0f176fa64f25..c4cb20f0d3ef 100644 --- a/vendor/github.com/prometheus/common/expfmt/expfmt.go +++ b/vendor/github.com/prometheus/common/expfmt/expfmt.go @@ -19,20 +19,22 @@ type Format string // Constants to assemble the Content-Type values for the different wire protocols. const ( - TextVersion = "0.0.4" - ProtoType = `application/vnd.google.protobuf` - ProtoProtocol = `io.prometheus.client.MetricFamily` - ProtoFmt = ProtoType + "; proto=" + ProtoProtocol + ";" - OpenMetricsType = `application/openmetrics-text` - OpenMetricsVersion = "0.0.1" + TextVersion = "0.0.4" + ProtoType = `application/vnd.google.protobuf` + ProtoProtocol = `io.prometheus.client.MetricFamily` + ProtoFmt = ProtoType + "; proto=" + ProtoProtocol + ";" + OpenMetricsType = `application/openmetrics-text` + OpenMetricsVersion_0_0_1 = "0.0.1" + OpenMetricsVersion_1_0_0 = "1.0.0" // The Content-Type values for the different wire protocols. - FmtUnknown Format = `` - FmtText Format = `text/plain; version=` + TextVersion + `; charset=utf-8` - FmtProtoDelim Format = ProtoFmt + ` encoding=delimited` - FmtProtoText Format = ProtoFmt + ` encoding=text` - FmtProtoCompact Format = ProtoFmt + ` encoding=compact-text` - FmtOpenMetrics Format = OpenMetricsType + `; version=` + OpenMetricsVersion + `; charset=utf-8` + FmtUnknown Format = `` + FmtText Format = `text/plain; version=` + TextVersion + `; charset=utf-8` + FmtProtoDelim Format = ProtoFmt + ` encoding=delimited` + FmtProtoText Format = ProtoFmt + ` encoding=text` + FmtProtoCompact Format = ProtoFmt + ` encoding=compact-text` + FmtOpenMetrics_1_0_0 Format = OpenMetricsType + `; version=` + OpenMetricsVersion_1_0_0 + `; charset=utf-8` + FmtOpenMetrics_0_0_1 Format = OpenMetricsType + `; version=` + OpenMetricsVersion_0_0_1 + `; charset=utf-8` ) const ( diff --git a/vendor/github.com/prometheus/common/expfmt/fuzz.go b/vendor/github.com/prometheus/common/expfmt/fuzz.go index f819e4f8b549..dfac962a4e7e 100644 --- a/vendor/github.com/prometheus/common/expfmt/fuzz.go +++ b/vendor/github.com/prometheus/common/expfmt/fuzz.go @@ -21,8 +21,8 @@ import "bytes" // Fuzz text metric parser with with github.com/dvyukov/go-fuzz: // -// go-fuzz-build github.com/prometheus/common/expfmt -// go-fuzz -bin expfmt-fuzz.zip -workdir fuzz +// go-fuzz-build github.com/prometheus/common/expfmt +// go-fuzz -bin expfmt-fuzz.zip -workdir fuzz // // Further input samples should go in the folder fuzz/corpus. func Fuzz(in []byte) int { diff --git a/vendor/github.com/prometheus/common/expfmt/openmetrics_create.go b/vendor/github.com/prometheus/common/expfmt/openmetrics_create.go index 9d94ae9effe3..21cdddcf0541 100644 --- a/vendor/github.com/prometheus/common/expfmt/openmetrics_create.go +++ b/vendor/github.com/prometheus/common/expfmt/openmetrics_create.go @@ -46,20 +46,20 @@ import ( // missing features and peculiarities to avoid complications when switching from // Prometheus to OpenMetrics or vice versa: // -// - Counters are expected to have the `_total` suffix in their metric name. In -// the output, the suffix will be truncated from the `# TYPE` and `# HELP` -// line. A counter with a missing `_total` suffix is not an error. However, -// its type will be set to `unknown` in that case to avoid invalid OpenMetrics -// output. +// - Counters are expected to have the `_total` suffix in their metric name. In +// the output, the suffix will be truncated from the `# TYPE` and `# HELP` +// line. A counter with a missing `_total` suffix is not an error. However, +// its type will be set to `unknown` in that case to avoid invalid OpenMetrics +// output. // -// - No support for the following (optional) features: `# UNIT` line, `_created` -// line, info type, stateset type, gaugehistogram type. +// - No support for the following (optional) features: `# UNIT` line, `_created` +// line, info type, stateset type, gaugehistogram type. // -// - The size of exemplar labels is not checked (i.e. it's possible to create -// exemplars that are larger than allowed by the OpenMetrics specification). +// - The size of exemplar labels is not checked (i.e. it's possible to create +// exemplars that are larger than allowed by the OpenMetrics specification). // -// - The value of Counters is not checked. (OpenMetrics doesn't allow counters -// with a `NaN` value.) +// - The value of Counters is not checked. (OpenMetrics doesn't allow counters +// with a `NaN` value.) func MetricFamilyToOpenMetrics(out io.Writer, in *dto.MetricFamily) (written int, err error) { name := in.GetName() if name == "" { diff --git a/vendor/github.com/prometheus/common/expfmt/text_create.go b/vendor/github.com/prometheus/common/expfmt/text_create.go index 5ba503b06547..2946b8f1a644 100644 --- a/vendor/github.com/prometheus/common/expfmt/text_create.go +++ b/vendor/github.com/prometheus/common/expfmt/text_create.go @@ -17,7 +17,6 @@ import ( "bufio" "fmt" "io" - "io/ioutil" "math" "strconv" "strings" @@ -44,7 +43,7 @@ const ( var ( bufPool = sync.Pool{ New: func() interface{} { - return bufio.NewWriter(ioutil.Discard) + return bufio.NewWriter(io.Discard) }, } numBufPool = sync.Pool{ diff --git a/vendor/github.com/prometheus/common/expfmt/text_parse.go b/vendor/github.com/prometheus/common/expfmt/text_parse.go index 84be0643ec67..35db1cc9d73c 100644 --- a/vendor/github.com/prometheus/common/expfmt/text_parse.go +++ b/vendor/github.com/prometheus/common/expfmt/text_parse.go @@ -24,8 +24,8 @@ import ( dto "github.com/prometheus/client_model/go" - "github.com/golang/protobuf/proto" //nolint:staticcheck // Ignore SA1019. Need to keep deprecated package for compatibility. "github.com/prometheus/common/model" + "google.golang.org/protobuf/proto" ) // A stateFn is a function that represents a state in a state machine. By @@ -142,9 +142,13 @@ func (p *TextParser) reset(in io.Reader) { func (p *TextParser) startOfLine() stateFn { p.lineCount++ if p.skipBlankTab(); p.err != nil { - // End of input reached. This is the only case where - // that is not an error but a signal that we are done. - p.err = nil + // This is the only place that we expect to see io.EOF, + // which is not an error but the signal that we are done. + // Any other error that happens to align with the start of + // a line is still an error. + if p.err == io.EOF { + p.err = nil + } return nil } switch p.currentByte { diff --git a/vendor/github.com/prometheus/common/internal/bitbucket.org/ww/goautoneg/autoneg.go b/vendor/github.com/prometheus/common/internal/bitbucket.org/ww/goautoneg/autoneg.go index 26e92288c7c0..a21b9d15dd89 100644 --- a/vendor/github.com/prometheus/common/internal/bitbucket.org/ww/goautoneg/autoneg.go +++ b/vendor/github.com/prometheus/common/internal/bitbucket.org/ww/goautoneg/autoneg.go @@ -11,18 +11,18 @@ 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 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. + Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. - Neither the name of the Open Knowledge Foundation Ltd. nor the - names of its contributors may be used to endorse or promote - products derived from this software without specific prior written - permission. + Neither the name of the Open Knowledge Foundation Ltd. nor the + names of its contributors may be used to endorse or promote + products derived from this software without specific prior written + permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT @@ -35,8 +35,6 @@ DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - - */ package goautoneg diff --git a/vendor/github.com/prometheus/common/model/time.go b/vendor/github.com/prometheus/common/model/time.go index c909b8aa8c50..5727452c1ee9 100644 --- a/vendor/github.com/prometheus/common/model/time.go +++ b/vendor/github.com/prometheus/common/model/time.go @@ -18,7 +18,6 @@ import ( "errors" "fmt" "math" - "regexp" "strconv" "strings" "time" @@ -183,54 +182,78 @@ func (d *Duration) Type() string { return "duration" } -var durationRE = regexp.MustCompile("^(([0-9]+)y)?(([0-9]+)w)?(([0-9]+)d)?(([0-9]+)h)?(([0-9]+)m)?(([0-9]+)s)?(([0-9]+)ms)?$") +func isdigit(c byte) bool { return c >= '0' && c <= '9' } + +// Units are required to go in order from biggest to smallest. +// This guards against confusion from "1m1d" being 1 minute + 1 day, not 1 month + 1 day. +var unitMap = map[string]struct { + pos int + mult uint64 +}{ + "ms": {7, uint64(time.Millisecond)}, + "s": {6, uint64(time.Second)}, + "m": {5, uint64(time.Minute)}, + "h": {4, uint64(time.Hour)}, + "d": {3, uint64(24 * time.Hour)}, + "w": {2, uint64(7 * 24 * time.Hour)}, + "y": {1, uint64(365 * 24 * time.Hour)}, +} // ParseDuration parses a string into a time.Duration, assuming that a year // always has 365d, a week always has 7d, and a day always has 24h. -func ParseDuration(durationStr string) (Duration, error) { - switch durationStr { +func ParseDuration(s string) (Duration, error) { + switch s { case "0": // Allow 0 without a unit. return 0, nil case "": return 0, errors.New("empty duration string") } - matches := durationRE.FindStringSubmatch(durationStr) - if matches == nil { - return 0, fmt.Errorf("not a valid duration string: %q", durationStr) - } - var dur time.Duration - // Parse the match at pos `pos` in the regex and use `mult` to turn that - // into ms, then add that value to the total parsed duration. - var overflowErr error - m := func(pos int, mult time.Duration) { - if matches[pos] == "" { - return + orig := s + var dur uint64 + lastUnitPos := 0 + + for s != "" { + if !isdigit(s[0]) { + return 0, fmt.Errorf("not a valid duration string: %q", orig) + } + // Consume [0-9]* + i := 0 + for ; i < len(s) && isdigit(s[i]); i++ { + } + v, err := strconv.ParseUint(s[:i], 10, 0) + if err != nil { + return 0, fmt.Errorf("not a valid duration string: %q", orig) } - n, _ := strconv.Atoi(matches[pos]) + s = s[i:] + // Consume unit. + for i = 0; i < len(s) && !isdigit(s[i]); i++ { + } + if i == 0 { + return 0, fmt.Errorf("not a valid duration string: %q", orig) + } + u := s[:i] + s = s[i:] + unit, ok := unitMap[u] + if !ok { + return 0, fmt.Errorf("unknown unit %q in duration %q", u, orig) + } + if unit.pos <= lastUnitPos { // Units must go in order from biggest to smallest. + return 0, fmt.Errorf("not a valid duration string: %q", orig) + } + lastUnitPos = unit.pos // Check if the provided duration overflows time.Duration (> ~ 290years). - if n > int((1<<63-1)/mult/time.Millisecond) { - overflowErr = errors.New("duration out of range") + if v > 1<<63/unit.mult { + return 0, errors.New("duration out of range") } - d := time.Duration(n) * time.Millisecond - dur += d * mult - - if dur < 0 { - overflowErr = errors.New("duration out of range") + dur += v * unit.mult + if dur > 1<<63-1 { + return 0, errors.New("duration out of range") } } - - m(2, 1000*60*60*24*365) // y - m(4, 1000*60*60*24*7) // w - m(6, 1000*60*60*24) // d - m(8, 1000*60*60) // h - m(10, 1000*60) // m - m(12, 1000) // s - m(14, 1) // ms - - return Duration(dur), overflowErr + return Duration(dur), nil } func (d Duration) String() string { diff --git a/vendor/github.com/prometheus/common/model/value.go b/vendor/github.com/prometheus/common/model/value.go index c9d8fb1a2831..9eb440413fd3 100644 --- a/vendor/github.com/prometheus/common/model/value.go +++ b/vendor/github.com/prometheus/common/model/value.go @@ -16,20 +16,12 @@ package model import ( "encoding/json" "fmt" - "math" "sort" "strconv" "strings" ) var ( - // ZeroSamplePair is the pseudo zero-value of SamplePair used to signal a - // non-existing sample pair. It is a SamplePair with timestamp Earliest and - // value 0.0. Note that the natural zero value of SamplePair has a timestamp - // of 0, which is possible to appear in a real SamplePair and thus not - // suitable to signal a non-existing SamplePair. - ZeroSamplePair = SamplePair{Timestamp: Earliest} - // ZeroSample is the pseudo zero-value of Sample used to signal a // non-existing sample. It is a Sample with timestamp Earliest, value 0.0, // and metric nil. Note that the natural zero value of Sample has a timestamp @@ -38,82 +30,14 @@ var ( ZeroSample = Sample{Timestamp: Earliest} ) -// A SampleValue is a representation of a value for a given sample at a given -// time. -type SampleValue float64 - -// MarshalJSON implements json.Marshaler. -func (v SampleValue) MarshalJSON() ([]byte, error) { - return json.Marshal(v.String()) -} - -// UnmarshalJSON implements json.Unmarshaler. -func (v *SampleValue) UnmarshalJSON(b []byte) error { - if len(b) < 2 || b[0] != '"' || b[len(b)-1] != '"' { - return fmt.Errorf("sample value must be a quoted string") - } - f, err := strconv.ParseFloat(string(b[1:len(b)-1]), 64) - if err != nil { - return err - } - *v = SampleValue(f) - return nil -} - -// Equal returns true if the value of v and o is equal or if both are NaN. Note -// that v==o is false if both are NaN. If you want the conventional float -// behavior, use == to compare two SampleValues. -func (v SampleValue) Equal(o SampleValue) bool { - if v == o { - return true - } - return math.IsNaN(float64(v)) && math.IsNaN(float64(o)) -} - -func (v SampleValue) String() string { - return strconv.FormatFloat(float64(v), 'f', -1, 64) -} - -// SamplePair pairs a SampleValue with a Timestamp. -type SamplePair struct { - Timestamp Time - Value SampleValue -} - -// MarshalJSON implements json.Marshaler. -func (s SamplePair) MarshalJSON() ([]byte, error) { - t, err := json.Marshal(s.Timestamp) - if err != nil { - return nil, err - } - v, err := json.Marshal(s.Value) - if err != nil { - return nil, err - } - return []byte(fmt.Sprintf("[%s,%s]", t, v)), nil -} - -// UnmarshalJSON implements json.Unmarshaler. -func (s *SamplePair) UnmarshalJSON(b []byte) error { - v := [...]json.Unmarshaler{&s.Timestamp, &s.Value} - return json.Unmarshal(b, &v) -} - -// Equal returns true if this SamplePair and o have equal Values and equal -// Timestamps. The semantics of Value equality is defined by SampleValue.Equal. -func (s *SamplePair) Equal(o *SamplePair) bool { - return s == o || (s.Value.Equal(o.Value) && s.Timestamp.Equal(o.Timestamp)) -} - -func (s SamplePair) String() string { - return fmt.Sprintf("%s @[%s]", s.Value, s.Timestamp) -} - -// Sample is a sample pair associated with a metric. +// Sample is a sample pair associated with a metric. A single sample must either +// define Value or Histogram but not both. Histogram == nil implies the Value +// field is used, otherwise it should be ignored. type Sample struct { - Metric Metric `json:"metric"` - Value SampleValue `json:"value"` - Timestamp Time `json:"timestamp"` + Metric Metric `json:"metric"` + Value SampleValue `json:"value"` + Timestamp Time `json:"timestamp"` + Histogram *SampleHistogram `json:"histogram"` } // Equal compares first the metrics, then the timestamp, then the value. The @@ -129,11 +53,19 @@ func (s *Sample) Equal(o *Sample) bool { if !s.Timestamp.Equal(o.Timestamp) { return false } - + if s.Histogram != nil { + return s.Histogram.Equal(o.Histogram) + } return s.Value.Equal(o.Value) } func (s Sample) String() string { + if s.Histogram != nil { + return fmt.Sprintf("%s => %s", s.Metric, SampleHistogramPair{ + Timestamp: s.Timestamp, + Histogram: s.Histogram, + }) + } return fmt.Sprintf("%s => %s", s.Metric, SamplePair{ Timestamp: s.Timestamp, Value: s.Value, @@ -142,6 +74,19 @@ func (s Sample) String() string { // MarshalJSON implements json.Marshaler. func (s Sample) MarshalJSON() ([]byte, error) { + if s.Histogram != nil { + v := struct { + Metric Metric `json:"metric"` + Histogram SampleHistogramPair `json:"histogram"` + }{ + Metric: s.Metric, + Histogram: SampleHistogramPair{ + Timestamp: s.Timestamp, + Histogram: s.Histogram, + }, + } + return json.Marshal(&v) + } v := struct { Metric Metric `json:"metric"` Value SamplePair `json:"value"` @@ -152,21 +97,25 @@ func (s Sample) MarshalJSON() ([]byte, error) { Value: s.Value, }, } - return json.Marshal(&v) } // UnmarshalJSON implements json.Unmarshaler. func (s *Sample) UnmarshalJSON(b []byte) error { v := struct { - Metric Metric `json:"metric"` - Value SamplePair `json:"value"` + Metric Metric `json:"metric"` + Value SamplePair `json:"value"` + Histogram SampleHistogramPair `json:"histogram"` }{ Metric: s.Metric, Value: SamplePair{ Timestamp: s.Timestamp, Value: s.Value, }, + Histogram: SampleHistogramPair{ + Timestamp: s.Timestamp, + Histogram: s.Histogram, + }, } if err := json.Unmarshal(b, &v); err != nil { @@ -174,8 +123,13 @@ func (s *Sample) UnmarshalJSON(b []byte) error { } s.Metric = v.Metric - s.Timestamp = v.Value.Timestamp - s.Value = v.Value.Value + if v.Histogram.Histogram != nil { + s.Timestamp = v.Histogram.Timestamp + s.Histogram = v.Histogram.Histogram + } else { + s.Timestamp = v.Value.Timestamp + s.Value = v.Value.Value + } return nil } @@ -221,80 +175,76 @@ func (s Samples) Equal(o Samples) bool { // SampleStream is a stream of Values belonging to an attached COWMetric. type SampleStream struct { - Metric Metric `json:"metric"` - Values []SamplePair `json:"values"` + Metric Metric `json:"metric"` + Values []SamplePair `json:"values"` + Histograms []SampleHistogramPair `json:"histograms"` } func (ss SampleStream) String() string { - vals := make([]string, len(ss.Values)) + valuesLength := len(ss.Values) + vals := make([]string, valuesLength+len(ss.Histograms)) for i, v := range ss.Values { vals[i] = v.String() } + for i, v := range ss.Histograms { + vals[i+valuesLength] = v.String() + } return fmt.Sprintf("%s =>\n%s", ss.Metric, strings.Join(vals, "\n")) } -// Value is a generic interface for values resulting from a query evaluation. -type Value interface { - Type() ValueType - String() string +func (ss SampleStream) MarshalJSON() ([]byte, error) { + if len(ss.Histograms) > 0 && len(ss.Values) > 0 { + v := struct { + Metric Metric `json:"metric"` + Values []SamplePair `json:"values"` + Histograms []SampleHistogramPair `json:"histograms"` + }{ + Metric: ss.Metric, + Values: ss.Values, + Histograms: ss.Histograms, + } + return json.Marshal(&v) + } else if len(ss.Histograms) > 0 { + v := struct { + Metric Metric `json:"metric"` + Histograms []SampleHistogramPair `json:"histograms"` + }{ + Metric: ss.Metric, + Histograms: ss.Histograms, + } + return json.Marshal(&v) + } else { + v := struct { + Metric Metric `json:"metric"` + Values []SamplePair `json:"values"` + }{ + Metric: ss.Metric, + Values: ss.Values, + } + return json.Marshal(&v) + } } -func (Matrix) Type() ValueType { return ValMatrix } -func (Vector) Type() ValueType { return ValVector } -func (*Scalar) Type() ValueType { return ValScalar } -func (*String) Type() ValueType { return ValString } - -type ValueType int - -const ( - ValNone ValueType = iota - ValScalar - ValVector - ValMatrix - ValString -) - -// MarshalJSON implements json.Marshaler. -func (et ValueType) MarshalJSON() ([]byte, error) { - return json.Marshal(et.String()) -} +func (ss *SampleStream) UnmarshalJSON(b []byte) error { + v := struct { + Metric Metric `json:"metric"` + Values []SamplePair `json:"values"` + Histograms []SampleHistogramPair `json:"histograms"` + }{ + Metric: ss.Metric, + Values: ss.Values, + Histograms: ss.Histograms, + } -func (et *ValueType) UnmarshalJSON(b []byte) error { - var s string - if err := json.Unmarshal(b, &s); err != nil { + if err := json.Unmarshal(b, &v); err != nil { return err } - switch s { - case "": - *et = ValNone - case "scalar": - *et = ValScalar - case "vector": - *et = ValVector - case "matrix": - *et = ValMatrix - case "string": - *et = ValString - default: - return fmt.Errorf("unknown value type %q", s) - } - return nil -} -func (e ValueType) String() string { - switch e { - case ValNone: - return "" - case ValScalar: - return "scalar" - case ValVector: - return "vector" - case ValMatrix: - return "matrix" - case ValString: - return "string" - } - panic("ValueType.String: unhandled value type") + ss.Metric = v.Metric + ss.Values = v.Values + ss.Histograms = v.Histograms + + return nil } // Scalar is a scalar value evaluated at the set timestamp. diff --git a/vendor/github.com/prometheus/common/model/value_float.go b/vendor/github.com/prometheus/common/model/value_float.go new file mode 100644 index 000000000000..0f615a705301 --- /dev/null +++ b/vendor/github.com/prometheus/common/model/value_float.go @@ -0,0 +1,100 @@ +// Copyright 2013 The Prometheus Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package model + +import ( + "encoding/json" + "fmt" + "math" + "strconv" +) + +var ( + // ZeroSamplePair is the pseudo zero-value of SamplePair used to signal a + // non-existing sample pair. It is a SamplePair with timestamp Earliest and + // value 0.0. Note that the natural zero value of SamplePair has a timestamp + // of 0, which is possible to appear in a real SamplePair and thus not + // suitable to signal a non-existing SamplePair. + ZeroSamplePair = SamplePair{Timestamp: Earliest} +) + +// A SampleValue is a representation of a value for a given sample at a given +// time. +type SampleValue float64 + +// MarshalJSON implements json.Marshaler. +func (v SampleValue) MarshalJSON() ([]byte, error) { + return json.Marshal(v.String()) +} + +// UnmarshalJSON implements json.Unmarshaler. +func (v *SampleValue) UnmarshalJSON(b []byte) error { + if len(b) < 2 || b[0] != '"' || b[len(b)-1] != '"' { + return fmt.Errorf("sample value must be a quoted string") + } + f, err := strconv.ParseFloat(string(b[1:len(b)-1]), 64) + if err != nil { + return err + } + *v = SampleValue(f) + return nil +} + +// Equal returns true if the value of v and o is equal or if both are NaN. Note +// that v==o is false if both are NaN. If you want the conventional float +// behavior, use == to compare two SampleValues. +func (v SampleValue) Equal(o SampleValue) bool { + if v == o { + return true + } + return math.IsNaN(float64(v)) && math.IsNaN(float64(o)) +} + +func (v SampleValue) String() string { + return strconv.FormatFloat(float64(v), 'f', -1, 64) +} + +// SamplePair pairs a SampleValue with a Timestamp. +type SamplePair struct { + Timestamp Time + Value SampleValue +} + +func (s SamplePair) MarshalJSON() ([]byte, error) { + t, err := json.Marshal(s.Timestamp) + if err != nil { + return nil, err + } + v, err := json.Marshal(s.Value) + if err != nil { + return nil, err + } + return []byte(fmt.Sprintf("[%s,%s]", t, v)), nil +} + +// UnmarshalJSON implements json.Unmarshaler. +func (s *SamplePair) UnmarshalJSON(b []byte) error { + v := [...]json.Unmarshaler{&s.Timestamp, &s.Value} + return json.Unmarshal(b, &v) +} + +// Equal returns true if this SamplePair and o have equal Values and equal +// Timestamps. The semantics of Value equality is defined by SampleValue.Equal. +func (s *SamplePair) Equal(o *SamplePair) bool { + return s == o || (s.Value.Equal(o.Value) && s.Timestamp.Equal(o.Timestamp)) +} + +func (s SamplePair) String() string { + return fmt.Sprintf("%s @[%s]", s.Value, s.Timestamp) +} diff --git a/vendor/github.com/prometheus/common/model/value_histogram.go b/vendor/github.com/prometheus/common/model/value_histogram.go new file mode 100644 index 000000000000..54bb038cfff3 --- /dev/null +++ b/vendor/github.com/prometheus/common/model/value_histogram.go @@ -0,0 +1,178 @@ +// Copyright 2013 The Prometheus Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package model + +import ( + "encoding/json" + "fmt" + "strconv" + "strings" +) + +type FloatString float64 + +func (v FloatString) String() string { + return strconv.FormatFloat(float64(v), 'f', -1, 64) +} + +func (v FloatString) MarshalJSON() ([]byte, error) { + return json.Marshal(v.String()) +} + +func (v *FloatString) UnmarshalJSON(b []byte) error { + if len(b) < 2 || b[0] != '"' || b[len(b)-1] != '"' { + return fmt.Errorf("float value must be a quoted string") + } + f, err := strconv.ParseFloat(string(b[1:len(b)-1]), 64) + if err != nil { + return err + } + *v = FloatString(f) + return nil +} + +type HistogramBucket struct { + Boundaries int32 + Lower FloatString + Upper FloatString + Count FloatString +} + +func (s HistogramBucket) MarshalJSON() ([]byte, error) { + b, err := json.Marshal(s.Boundaries) + if err != nil { + return nil, err + } + l, err := json.Marshal(s.Lower) + if err != nil { + return nil, err + } + u, err := json.Marshal(s.Upper) + if err != nil { + return nil, err + } + c, err := json.Marshal(s.Count) + if err != nil { + return nil, err + } + return []byte(fmt.Sprintf("[%s,%s,%s,%s]", b, l, u, c)), nil +} + +func (s *HistogramBucket) UnmarshalJSON(buf []byte) error { + tmp := []interface{}{&s.Boundaries, &s.Lower, &s.Upper, &s.Count} + wantLen := len(tmp) + if err := json.Unmarshal(buf, &tmp); err != nil { + return err + } + if gotLen := len(tmp); gotLen != wantLen { + return fmt.Errorf("wrong number of fields: %d != %d", gotLen, wantLen) + } + return nil +} + +func (s *HistogramBucket) Equal(o *HistogramBucket) bool { + return s == o || (s.Boundaries == o.Boundaries && s.Lower == o.Lower && s.Upper == o.Upper && s.Count == o.Count) +} + +func (b HistogramBucket) String() string { + var sb strings.Builder + lowerInclusive := b.Boundaries == 1 || b.Boundaries == 3 + upperInclusive := b.Boundaries == 0 || b.Boundaries == 3 + if lowerInclusive { + sb.WriteRune('[') + } else { + sb.WriteRune('(') + } + fmt.Fprintf(&sb, "%g,%g", b.Lower, b.Upper) + if upperInclusive { + sb.WriteRune(']') + } else { + sb.WriteRune(')') + } + fmt.Fprintf(&sb, ":%v", b.Count) + return sb.String() +} + +type HistogramBuckets []*HistogramBucket + +func (s HistogramBuckets) Equal(o HistogramBuckets) bool { + if len(s) != len(o) { + return false + } + + for i, bucket := range s { + if !bucket.Equal(o[i]) { + return false + } + } + return true +} + +type SampleHistogram struct { + Count FloatString `json:"count"` + Sum FloatString `json:"sum"` + Buckets HistogramBuckets `json:"buckets"` +} + +func (s SampleHistogram) String() string { + return fmt.Sprintf("Count: %f, Sum: %f, Buckets: %v", s.Count, s.Sum, s.Buckets) +} + +func (s *SampleHistogram) Equal(o *SampleHistogram) bool { + return s == o || (s.Count == o.Count && s.Sum == o.Sum && s.Buckets.Equal(o.Buckets)) +} + +type SampleHistogramPair struct { + Timestamp Time + // Histogram should never be nil, it's only stored as pointer for efficiency. + Histogram *SampleHistogram +} + +func (s SampleHistogramPair) MarshalJSON() ([]byte, error) { + if s.Histogram == nil { + return nil, fmt.Errorf("histogram is nil") + } + t, err := json.Marshal(s.Timestamp) + if err != nil { + return nil, err + } + v, err := json.Marshal(s.Histogram) + if err != nil { + return nil, err + } + return []byte(fmt.Sprintf("[%s,%s]", t, v)), nil +} + +func (s *SampleHistogramPair) UnmarshalJSON(buf []byte) error { + tmp := []interface{}{&s.Timestamp, &s.Histogram} + wantLen := len(tmp) + if err := json.Unmarshal(buf, &tmp); err != nil { + return err + } + if gotLen := len(tmp); gotLen != wantLen { + return fmt.Errorf("wrong number of fields: %d != %d", gotLen, wantLen) + } + if s.Histogram == nil { + return fmt.Errorf("histogram is null") + } + return nil +} + +func (s SampleHistogramPair) String() string { + return fmt.Sprintf("%s @[%s]", s.Histogram, s.Timestamp) +} + +func (s *SampleHistogramPair) Equal(o *SampleHistogramPair) bool { + return s == o || (s.Histogram.Equal(o.Histogram) && s.Timestamp.Equal(o.Timestamp)) +} diff --git a/vendor/github.com/prometheus/common/model/value_type.go b/vendor/github.com/prometheus/common/model/value_type.go new file mode 100644 index 000000000000..726c50ee638c --- /dev/null +++ b/vendor/github.com/prometheus/common/model/value_type.go @@ -0,0 +1,83 @@ +// Copyright 2013 The Prometheus Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package model + +import ( + "encoding/json" + "fmt" +) + +// Value is a generic interface for values resulting from a query evaluation. +type Value interface { + Type() ValueType + String() string +} + +func (Matrix) Type() ValueType { return ValMatrix } +func (Vector) Type() ValueType { return ValVector } +func (*Scalar) Type() ValueType { return ValScalar } +func (*String) Type() ValueType { return ValString } + +type ValueType int + +const ( + ValNone ValueType = iota + ValScalar + ValVector + ValMatrix + ValString +) + +// MarshalJSON implements json.Marshaler. +func (et ValueType) MarshalJSON() ([]byte, error) { + return json.Marshal(et.String()) +} + +func (et *ValueType) UnmarshalJSON(b []byte) error { + var s string + if err := json.Unmarshal(b, &s); err != nil { + return err + } + switch s { + case "": + *et = ValNone + case "scalar": + *et = ValScalar + case "vector": + *et = ValVector + case "matrix": + *et = ValMatrix + case "string": + *et = ValString + default: + return fmt.Errorf("unknown value type %q", s) + } + return nil +} + +func (e ValueType) String() string { + switch e { + case ValNone: + return "" + case ValScalar: + return "scalar" + case ValVector: + return "vector" + case ValMatrix: + return "matrix" + case ValString: + return "string" + } + panic("ValueType.String: unhandled value type") +} diff --git a/vendor/github.com/prometheus/procfs/Makefile.common b/vendor/github.com/prometheus/procfs/Makefile.common index 6c8e3e219797..b111d2562000 100644 --- a/vendor/github.com/prometheus/procfs/Makefile.common +++ b/vendor/github.com/prometheus/procfs/Makefile.common @@ -55,19 +55,22 @@ ifneq ($(shell which gotestsum),) endif endif -PROMU_VERSION ?= 0.13.0 +PROMU_VERSION ?= 0.14.0 PROMU_URL := https://github.com/prometheus/promu/releases/download/v$(PROMU_VERSION)/promu-$(PROMU_VERSION).$(GO_BUILD_PLATFORM).tar.gz +SKIP_GOLANGCI_LINT := GOLANGCI_LINT := GOLANGCI_LINT_OPTS ?= -GOLANGCI_LINT_VERSION ?= v1.45.2 +GOLANGCI_LINT_VERSION ?= v1.51.2 # golangci-lint only supports linux, darwin and windows platforms on i386/amd64. # windows isn't included here because of the path separator being different. ifeq ($(GOHOSTOS),$(filter $(GOHOSTOS),linux darwin)) ifeq ($(GOHOSTARCH),$(filter $(GOHOSTARCH),amd64 i386)) # If we're in CI and there is an Actions file, that means the linter # is being run in Actions, so we don't need to run it here. - ifeq (,$(CIRCLE_JOB)) + ifneq (,$(SKIP_GOLANGCI_LINT)) + GOLANGCI_LINT := + else ifeq (,$(CIRCLE_JOB)) GOLANGCI_LINT := $(FIRST_GOPATH)/bin/golangci-lint else ifeq (,$(wildcard .github/workflows/golangci-lint.yml)) GOLANGCI_LINT := $(FIRST_GOPATH)/bin/golangci-lint @@ -88,6 +91,8 @@ BUILD_DOCKER_ARCHS = $(addprefix common-docker-,$(DOCKER_ARCHS)) PUBLISH_DOCKER_ARCHS = $(addprefix common-docker-publish-,$(DOCKER_ARCHS)) TAG_DOCKER_ARCHS = $(addprefix common-docker-tag-latest-,$(DOCKER_ARCHS)) +SANITIZED_DOCKER_IMAGE_TAG := $(subst +,-,$(DOCKER_IMAGE_TAG)) + ifeq ($(GOHOSTARCH),amd64) ifeq ($(GOHOSTOS),$(filter $(GOHOSTOS),linux freebsd darwin windows)) # Only supported on amd64 @@ -202,7 +207,7 @@ common-tarball: promu .PHONY: common-docker $(BUILD_DOCKER_ARCHS) common-docker: $(BUILD_DOCKER_ARCHS) $(BUILD_DOCKER_ARCHS): common-docker-%: - docker build -t "$(DOCKER_REPO)/$(DOCKER_IMAGE_NAME)-linux-$*:$(DOCKER_IMAGE_TAG)" \ + docker build -t "$(DOCKER_REPO)/$(DOCKER_IMAGE_NAME)-linux-$*:$(SANITIZED_DOCKER_IMAGE_TAG)" \ -f $(DOCKERFILE_PATH) \ --build-arg ARCH="$*" \ --build-arg OS="linux" \ @@ -211,19 +216,19 @@ $(BUILD_DOCKER_ARCHS): common-docker-%: .PHONY: common-docker-publish $(PUBLISH_DOCKER_ARCHS) common-docker-publish: $(PUBLISH_DOCKER_ARCHS) $(PUBLISH_DOCKER_ARCHS): common-docker-publish-%: - docker push "$(DOCKER_REPO)/$(DOCKER_IMAGE_NAME)-linux-$*:$(DOCKER_IMAGE_TAG)" + docker push "$(DOCKER_REPO)/$(DOCKER_IMAGE_NAME)-linux-$*:$(SANITIZED_DOCKER_IMAGE_TAG)" DOCKER_MAJOR_VERSION_TAG = $(firstword $(subst ., ,$(shell cat VERSION))) .PHONY: common-docker-tag-latest $(TAG_DOCKER_ARCHS) common-docker-tag-latest: $(TAG_DOCKER_ARCHS) $(TAG_DOCKER_ARCHS): common-docker-tag-latest-%: - docker tag "$(DOCKER_REPO)/$(DOCKER_IMAGE_NAME)-linux-$*:$(DOCKER_IMAGE_TAG)" "$(DOCKER_REPO)/$(DOCKER_IMAGE_NAME)-linux-$*:latest" - docker tag "$(DOCKER_REPO)/$(DOCKER_IMAGE_NAME)-linux-$*:$(DOCKER_IMAGE_TAG)" "$(DOCKER_REPO)/$(DOCKER_IMAGE_NAME)-linux-$*:v$(DOCKER_MAJOR_VERSION_TAG)" + docker tag "$(DOCKER_REPO)/$(DOCKER_IMAGE_NAME)-linux-$*:$(SANITIZED_DOCKER_IMAGE_TAG)" "$(DOCKER_REPO)/$(DOCKER_IMAGE_NAME)-linux-$*:latest" + docker tag "$(DOCKER_REPO)/$(DOCKER_IMAGE_NAME)-linux-$*:$(SANITIZED_DOCKER_IMAGE_TAG)" "$(DOCKER_REPO)/$(DOCKER_IMAGE_NAME)-linux-$*:v$(DOCKER_MAJOR_VERSION_TAG)" .PHONY: common-docker-manifest common-docker-manifest: - DOCKER_CLI_EXPERIMENTAL=enabled docker manifest create -a "$(DOCKER_REPO)/$(DOCKER_IMAGE_NAME):$(DOCKER_IMAGE_TAG)" $(foreach ARCH,$(DOCKER_ARCHS),$(DOCKER_REPO)/$(DOCKER_IMAGE_NAME)-linux-$(ARCH):$(DOCKER_IMAGE_TAG)) - DOCKER_CLI_EXPERIMENTAL=enabled docker manifest push "$(DOCKER_REPO)/$(DOCKER_IMAGE_NAME):$(DOCKER_IMAGE_TAG)" + DOCKER_CLI_EXPERIMENTAL=enabled docker manifest create -a "$(DOCKER_REPO)/$(DOCKER_IMAGE_NAME):$(SANITIZED_DOCKER_IMAGE_TAG)" $(foreach ARCH,$(DOCKER_ARCHS),$(DOCKER_REPO)/$(DOCKER_IMAGE_NAME)-linux-$(ARCH):$(SANITIZED_DOCKER_IMAGE_TAG)) + DOCKER_CLI_EXPERIMENTAL=enabled docker manifest push "$(DOCKER_REPO)/$(DOCKER_IMAGE_NAME):$(SANITIZED_DOCKER_IMAGE_TAG)" .PHONY: promu promu: $(PROMU) diff --git a/vendor/github.com/prometheus/procfs/cpuinfo.go b/vendor/github.com/prometheus/procfs/cpuinfo.go index ff6b927da159..06968ca2ed40 100644 --- a/vendor/github.com/prometheus/procfs/cpuinfo.go +++ b/vendor/github.com/prometheus/procfs/cpuinfo.go @@ -380,6 +380,42 @@ func parseCPUInfoMips(info []byte) ([]CPUInfo, error) { return cpuinfo, nil } +func parseCPUInfoLoong(info []byte) ([]CPUInfo, error) { + scanner := bufio.NewScanner(bytes.NewReader(info)) + // find the first "processor" line + firstLine := firstNonEmptyLine(scanner) + if !strings.HasPrefix(firstLine, "system type") || !strings.Contains(firstLine, ":") { + return nil, errors.New("invalid cpuinfo file: " + firstLine) + } + field := strings.SplitN(firstLine, ": ", 2) + cpuinfo := []CPUInfo{} + systemType := field[1] + i := 0 + for scanner.Scan() { + line := scanner.Text() + if !strings.Contains(line, ":") { + continue + } + field := strings.SplitN(line, ": ", 2) + switch strings.TrimSpace(field[0]) { + case "processor": + v, err := strconv.ParseUint(field[1], 0, 32) + if err != nil { + return nil, err + } + i = int(v) + cpuinfo = append(cpuinfo, CPUInfo{}) // start of the next processor + cpuinfo[i].Processor = uint(v) + cpuinfo[i].VendorID = systemType + case "CPU Family": + cpuinfo[i].CPUFamily = field[1] + case "Model Name": + cpuinfo[i].ModelName = field[1] + } + } + return cpuinfo, nil +} + func parseCPUInfoPPC(info []byte) ([]CPUInfo, error) { scanner := bufio.NewScanner(bytes.NewReader(info)) diff --git a/vendor/github.com/prometheus/procfs/cpuinfo_loong64.go b/vendor/github.com/prometheus/procfs/cpuinfo_loong64.go new file mode 100644 index 000000000000..d88442f0edfd --- /dev/null +++ b/vendor/github.com/prometheus/procfs/cpuinfo_loong64.go @@ -0,0 +1,19 @@ +// Copyright 2022 The Prometheus Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +//go:build linux +// +build linux + +package procfs + +var parseCPUInfo = parseCPUInfoLoong diff --git a/vendor/github.com/prometheus/procfs/cpuinfo_others.go b/vendor/github.com/prometheus/procfs/cpuinfo_others.go index ea41bf2ca1e2..a6b2b3127cb1 100644 --- a/vendor/github.com/prometheus/procfs/cpuinfo_others.go +++ b/vendor/github.com/prometheus/procfs/cpuinfo_others.go @@ -11,8 +11,8 @@ // See the License for the specific language governing permissions and // limitations under the License. -//go:build linux && !386 && !amd64 && !arm && !arm64 && !mips && !mips64 && !mips64le && !mipsle && !ppc64 && !ppc64le && !riscv64 && !s390x -// +build linux,!386,!amd64,!arm,!arm64,!mips,!mips64,!mips64le,!mipsle,!ppc64,!ppc64le,!riscv64,!s390x +//go:build linux && !386 && !amd64 && !arm && !arm64 && !loong64 && !mips && !mips64 && !mips64le && !mipsle && !ppc64 && !ppc64le && !riscv64 && !s390x +// +build linux,!386,!amd64,!arm,!arm64,!loong64,!mips,!mips64,!mips64le,!mipsle,!ppc64,!ppc64le,!riscv64,!s390x package procfs diff --git a/vendor/github.com/prometheus/procfs/doc.go b/vendor/github.com/prometheus/procfs/doc.go index d31a82600f67..f9d961e44179 100644 --- a/vendor/github.com/prometheus/procfs/doc.go +++ b/vendor/github.com/prometheus/procfs/doc.go @@ -16,30 +16,29 @@ // // Example: // -// package main -// -// import ( -// "fmt" -// "log" -// -// "github.com/prometheus/procfs" -// ) -// -// func main() { -// p, err := procfs.Self() -// if err != nil { -// log.Fatalf("could not get process: %s", err) -// } -// -// stat, err := p.Stat() -// if err != nil { -// log.Fatalf("could not get process stat: %s", err) -// } -// -// fmt.Printf("command: %s\n", stat.Comm) -// fmt.Printf("cpu time: %fs\n", stat.CPUTime()) -// fmt.Printf("vsize: %dB\n", stat.VirtualMemory()) -// fmt.Printf("rss: %dB\n", stat.ResidentMemory()) -// } -// +// package main +// +// import ( +// "fmt" +// "log" +// +// "github.com/prometheus/procfs" +// ) +// +// func main() { +// p, err := procfs.Self() +// if err != nil { +// log.Fatalf("could not get process: %s", err) +// } +// +// stat, err := p.Stat() +// if err != nil { +// log.Fatalf("could not get process stat: %s", err) +// } +// +// fmt.Printf("command: %s\n", stat.Comm) +// fmt.Printf("cpu time: %fs\n", stat.CPUTime()) +// fmt.Printf("vsize: %dB\n", stat.VirtualMemory()) +// fmt.Printf("rss: %dB\n", stat.ResidentMemory()) +// } package procfs diff --git a/vendor/github.com/prometheus/procfs/fs.go b/vendor/github.com/prometheus/procfs/fs.go index 0102ab0fd856..60c551e026bf 100644 --- a/vendor/github.com/prometheus/procfs/fs.go +++ b/vendor/github.com/prometheus/procfs/fs.go @@ -21,6 +21,7 @@ import ( // kernel data structures. type FS struct { proc fs.FS + real bool } // DefaultMountPoint is the common mount point of the proc filesystem. @@ -39,5 +40,11 @@ func NewFS(mountPoint string) (FS, error) { if err != nil { return FS{}, err } - return FS{fs}, nil + + real, err := isRealProc(mountPoint) + if err != nil { + return FS{}, err + } + + return FS{fs, real}, nil } diff --git a/vendor/github.com/prometheus/procfs/fs_statfs_notype.go b/vendor/github.com/prometheus/procfs/fs_statfs_notype.go new file mode 100644 index 000000000000..800576968966 --- /dev/null +++ b/vendor/github.com/prometheus/procfs/fs_statfs_notype.go @@ -0,0 +1,23 @@ +// Copyright 2018 The Prometheus Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +//go:build netbsd || openbsd || solaris || windows +// +build netbsd openbsd solaris windows + +package procfs + +// isRealProc returns true on architectures that don't have a Type argument +// in their Statfs_t struct +func isRealProc(mountPoint string) (bool, error) { + return true, nil +} diff --git a/vendor/github.com/prometheus/procfs/fs_statfs_type.go b/vendor/github.com/prometheus/procfs/fs_statfs_type.go new file mode 100644 index 000000000000..6233217ad292 --- /dev/null +++ b/vendor/github.com/prometheus/procfs/fs_statfs_type.go @@ -0,0 +1,33 @@ +// Copyright 2018 The Prometheus Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +//go:build !netbsd && !openbsd && !solaris && !windows +// +build !netbsd,!openbsd,!solaris,!windows + +package procfs + +import ( + "syscall" +) + +// isRealProc determines whether supplied mountpoint is really a proc filesystem. +func isRealProc(mountPoint string) (bool, error) { + stat := syscall.Statfs_t{} + err := syscall.Statfs(mountPoint, &stat) + if err != nil { + return false, err + } + + // 0x9fa0 is PROC_SUPER_MAGIC: https://elixir.bootlin.com/linux/v6.1/source/include/uapi/linux/magic.h#L87 + return stat.Type == 0x9fa0, nil +} diff --git a/vendor/github.com/prometheus/procfs/internal/util/parse.go b/vendor/github.com/prometheus/procfs/internal/util/parse.go index b030951faf98..14272dc78857 100644 --- a/vendor/github.com/prometheus/procfs/internal/util/parse.go +++ b/vendor/github.com/prometheus/procfs/internal/util/parse.go @@ -64,6 +64,21 @@ func ParsePInt64s(ss []string) ([]*int64, error) { return us, nil } +// Parses a uint64 from given hex in string. +func ParseHexUint64s(ss []string) ([]*uint64, error) { + us := make([]*uint64, 0, len(ss)) + for _, s := range ss { + u, err := strconv.ParseUint(s, 16, 64) + if err != nil { + return nil, err + } + + us = append(us, &u) + } + + return us, nil +} + // ReadUintFromFile reads a file and attempts to parse a uint64 from it. func ReadUintFromFile(path string) (uint64, error) { data, err := os.ReadFile(path) diff --git a/vendor/github.com/prometheus/procfs/mountstats.go b/vendor/github.com/prometheus/procfs/mountstats.go index f7a828bb1da7..7f68890cff16 100644 --- a/vendor/github.com/prometheus/procfs/mountstats.go +++ b/vendor/github.com/prometheus/procfs/mountstats.go @@ -186,6 +186,8 @@ type NFSOperationStats struct { CumulativeTotalResponseMilliseconds uint64 // Duration from when a request was enqueued to when it was completely handled. CumulativeTotalRequestMilliseconds uint64 + // The average time from the point the client sends RPC requests until it receives the response. + AverageRTTMilliseconds float64 // The count of operations that complete with tk_status < 0. These statuses usually indicate error conditions. Errors uint64 } @@ -284,7 +286,8 @@ func parseMountStats(r io.Reader) ([]*Mount, error) { } // parseMount parses an entry in /proc/[pid]/mountstats in the format: -// device [device] mounted on [mount] with fstype [type] +// +// device [device] mounted on [mount] with fstype [type] func parseMount(ss []string) (*Mount, error) { if len(ss) < deviceEntryLen { return nil, fmt.Errorf("invalid device entry: %v", ss) @@ -533,7 +536,6 @@ func parseNFSOperationStats(s *bufio.Scanner) ([]NFSOperationStats, error) { ns = append(ns, n) } - opStats := NFSOperationStats{ Operation: strings.TrimSuffix(ss[0], ":"), Requests: ns[0], @@ -545,6 +547,9 @@ func parseNFSOperationStats(s *bufio.Scanner) ([]NFSOperationStats, error) { CumulativeTotalResponseMilliseconds: ns[6], CumulativeTotalRequestMilliseconds: ns[7], } + if ns[0] != 0 { + opStats.AverageRTTMilliseconds = float64(ns[6]) / float64(ns[0]) + } if len(ns) > 8 { opStats.Errors = ns[8] diff --git a/vendor/github.com/prometheus/procfs/net_conntrackstat.go b/vendor/github.com/prometheus/procfs/net_conntrackstat.go index 8300daca0545..64a0e946068c 100644 --- a/vendor/github.com/prometheus/procfs/net_conntrackstat.go +++ b/vendor/github.com/prometheus/procfs/net_conntrackstat.go @@ -18,7 +18,6 @@ import ( "bytes" "fmt" "io" - "strconv" "strings" "github.com/prometheus/procfs/internal/util" @@ -28,9 +27,13 @@ import ( // and contains netfilter conntrack statistics at one CPU core. type ConntrackStatEntry struct { Entries uint64 + Searched uint64 Found uint64 + New uint64 Invalid uint64 Ignore uint64 + Delete uint64 + DeleteList uint64 Insert uint64 InsertFailed uint64 Drop uint64 @@ -81,73 +84,34 @@ func parseConntrackStat(r io.Reader) ([]ConntrackStatEntry, error) { // Parses a ConntrackStatEntry from given array of fields. func parseConntrackStatEntry(fields []string) (*ConntrackStatEntry, error) { - if len(fields) != 17 { - return nil, fmt.Errorf("invalid conntrackstat entry, missing fields") - } - entry := &ConntrackStatEntry{} - - entries, err := parseConntrackStatField(fields[0]) - if err != nil { - return nil, err - } - entry.Entries = entries - - found, err := parseConntrackStatField(fields[2]) - if err != nil { - return nil, err - } - entry.Found = found - - invalid, err := parseConntrackStatField(fields[4]) - if err != nil { - return nil, err - } - entry.Invalid = invalid - - ignore, err := parseConntrackStatField(fields[5]) - if err != nil { - return nil, err - } - entry.Ignore = ignore - - insert, err := parseConntrackStatField(fields[8]) + entries, err := util.ParseHexUint64s(fields) if err != nil { - return nil, err + return nil, fmt.Errorf("invalid conntrackstat entry, couldn't parse fields: %s", err) } - entry.Insert = insert - - insertFailed, err := parseConntrackStatField(fields[9]) - if err != nil { - return nil, err + numEntries := len(entries) + if numEntries < 16 || numEntries > 17 { + return nil, fmt.Errorf("invalid conntrackstat entry, invalid number of fields: %d", numEntries) } - entry.InsertFailed = insertFailed - drop, err := parseConntrackStatField(fields[10]) - if err != nil { - return nil, err + stats := &ConntrackStatEntry{ + Entries: *entries[0], + Searched: *entries[1], + Found: *entries[2], + New: *entries[3], + Invalid: *entries[4], + Ignore: *entries[5], + Delete: *entries[6], + DeleteList: *entries[7], + Insert: *entries[8], + InsertFailed: *entries[9], + Drop: *entries[10], + EarlyDrop: *entries[11], } - entry.Drop = drop - earlyDrop, err := parseConntrackStatField(fields[11]) - if err != nil { - return nil, err + // Ignore missing search_restart on Linux < 2.6.35. + if numEntries == 17 { + stats.SearchRestart = *entries[16] } - entry.EarlyDrop = earlyDrop - searchRestart, err := parseConntrackStatField(fields[16]) - if err != nil { - return nil, err - } - entry.SearchRestart = searchRestart - - return entry, nil -} - -// Parses a uint64 from given hex in string. -func parseConntrackStatField(field string) (uint64, error) { - val, err := strconv.ParseUint(field, 16, 64) - if err != nil { - return 0, fmt.Errorf("couldn't parse %q field: %w", field, err) - } - return val, err + return stats, nil } diff --git a/vendor/github.com/prometheus/procfs/net_softnet.go b/vendor/github.com/prometheus/procfs/net_softnet.go index a94f86dc4ae6..540cea52c6f7 100644 --- a/vendor/github.com/prometheus/procfs/net_softnet.go +++ b/vendor/github.com/prometheus/procfs/net_softnet.go @@ -27,8 +27,9 @@ import ( // For the proc file format details, // See: // * Linux 2.6.23 https://elixir.bootlin.com/linux/v2.6.23/source/net/core/dev.c#L2343 -// * Linux 4.17 https://elixir.bootlin.com/linux/v4.17/source/net/core/net-procfs.c#L162 -// and https://elixir.bootlin.com/linux/v4.17/source/include/linux/netdevice.h#L2810. +// * Linux 2.6.39 https://elixir.bootlin.com/linux/v2.6.39/source/net/core/dev.c#L4086 +// * Linux 4.18 https://elixir.bootlin.com/linux/v4.18/source/net/core/net-procfs.c#L162 +// * Linux 5.14 https://elixir.bootlin.com/linux/v5.14/source/net/core/net-procfs.c#L169 // SoftnetStat contains a single row of data from /proc/net/softnet_stat. type SoftnetStat struct { @@ -38,6 +39,18 @@ type SoftnetStat struct { Dropped uint32 // Number of times processing packets ran out of quota. TimeSqueezed uint32 + // Number of collision occur while obtaining device lock while transmitting. + CPUCollision uint32 + // Number of times cpu woken up received_rps. + ReceivedRps uint32 + // number of times flow limit has been reached. + FlowLimitCount uint32 + // Softnet backlog status. + SoftnetBacklogLen uint32 + // CPU id owning this softnet_data. + Index uint32 + // softnet_data's Width. + Width int } var softNetProcFile = "net/softnet_stat" @@ -63,25 +76,65 @@ func parseSoftnet(r io.Reader) ([]SoftnetStat, error) { s := bufio.NewScanner(r) var stats []SoftnetStat + cpuIndex := 0 for s.Scan() { columns := strings.Fields(s.Text()) width := len(columns) + softnetStat := SoftnetStat{} if width < minColumns { return nil, fmt.Errorf("%d columns were detected, but at least %d were expected", width, minColumns) } - // We only parse the first three columns at the moment. - us, err := parseHexUint32s(columns[0:3]) - if err != nil { - return nil, err + // Linux 2.6.23 https://elixir.bootlin.com/linux/v2.6.23/source/net/core/dev.c#L2347 + if width >= minColumns { + us, err := parseHexUint32s(columns[0:9]) + if err != nil { + return nil, err + } + + softnetStat.Processed = us[0] + softnetStat.Dropped = us[1] + softnetStat.TimeSqueezed = us[2] + softnetStat.CPUCollision = us[8] + } + + // Linux 2.6.39 https://elixir.bootlin.com/linux/v2.6.39/source/net/core/dev.c#L4086 + if width >= 10 { + us, err := parseHexUint32s(columns[9:10]) + if err != nil { + return nil, err + } + + softnetStat.ReceivedRps = us[0] } - stats = append(stats, SoftnetStat{ - Processed: us[0], - Dropped: us[1], - TimeSqueezed: us[2], - }) + // Linux 4.18 https://elixir.bootlin.com/linux/v4.18/source/net/core/net-procfs.c#L162 + if width >= 11 { + us, err := parseHexUint32s(columns[10:11]) + if err != nil { + return nil, err + } + + softnetStat.FlowLimitCount = us[0] + } + + // Linux 5.14 https://elixir.bootlin.com/linux/v5.14/source/net/core/net-procfs.c#L169 + if width >= 13 { + us, err := parseHexUint32s(columns[11:13]) + if err != nil { + return nil, err + } + + softnetStat.SoftnetBacklogLen = us[0] + softnetStat.Index = us[1] + } else { + // For older kernels, create the Index based on the scan line number. + softnetStat.Index = uint32(cpuIndex) + } + softnetStat.Width = width + stats = append(stats, softnetStat) + cpuIndex++ } return stats, nil diff --git a/vendor/github.com/prometheus/procfs/net_wireless.go b/vendor/github.com/prometheus/procfs/net_wireless.go new file mode 100644 index 000000000000..c80fb154247c --- /dev/null +++ b/vendor/github.com/prometheus/procfs/net_wireless.go @@ -0,0 +1,182 @@ +// Copyright 2023 The Prometheus Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package procfs + +import ( + "bufio" + "bytes" + "fmt" + "io" + "strconv" + "strings" + + "github.com/prometheus/procfs/internal/util" +) + +// Wireless models the content of /proc/net/wireless. +type Wireless struct { + Name string + + // Status is the current 4-digit hex value status of the interface. + Status uint64 + + // QualityLink is the link quality. + QualityLink int + + // QualityLevel is the signal gain (dBm). + QualityLevel int + + // QualityNoise is the signal noise baseline (dBm). + QualityNoise int + + // DiscardedNwid is the number of discarded packets with wrong nwid/essid. + DiscardedNwid int + + // DiscardedCrypt is the number of discarded packets with wrong code/decode (WEP). + DiscardedCrypt int + + // DiscardedFrag is the number of discarded packets that can't perform MAC reassembly. + DiscardedFrag int + + // DiscardedRetry is the number of discarded packets that reached max MAC retries. + DiscardedRetry int + + // DiscardedMisc is the number of discarded packets for other reasons. + DiscardedMisc int + + // MissedBeacon is the number of missed beacons/superframe. + MissedBeacon int +} + +// Wireless returns kernel wireless statistics. +func (fs FS) Wireless() ([]*Wireless, error) { + b, err := util.ReadFileNoStat(fs.proc.Path("net/wireless")) + if err != nil { + return nil, err + } + + m, err := parseWireless(bytes.NewReader(b)) + if err != nil { + return nil, fmt.Errorf("failed to parse wireless: %w", err) + } + + return m, nil +} + +// parseWireless parses the contents of /proc/net/wireless. +/* +Inter-| sta-| Quality | Discarded packets | Missed | WE +face | tus | link level noise | nwid crypt frag retry misc | beacon | 22 + eth1: 0000 5. -256. -10. 0 1 0 3 0 0 + eth2: 0000 5. -256. -20. 0 2 0 4 0 0 +*/ +func parseWireless(r io.Reader) ([]*Wireless, error) { + var ( + interfaces []*Wireless + scanner = bufio.NewScanner(r) + ) + + for n := 0; scanner.Scan(); n++ { + // Skip the 2 header lines. + if n < 2 { + continue + } + + line := scanner.Text() + + parts := strings.Split(line, ":") + if len(parts) != 2 { + return nil, fmt.Errorf("expected 2 parts after splitting line by ':', got %d for line %q", len(parts), line) + } + + name := strings.TrimSpace(parts[0]) + stats := strings.Fields(parts[1]) + + if len(stats) < 10 { + return nil, fmt.Errorf("invalid number of fields in line %d, expected at least 10, got %d: %q", n, len(stats), line) + } + + status, err := strconv.ParseUint(stats[0], 16, 16) + if err != nil { + return nil, fmt.Errorf("invalid status in line %d: %q", n, line) + } + + qlink, err := strconv.Atoi(strings.TrimSuffix(stats[1], ".")) + if err != nil { + return nil, fmt.Errorf("failed to parse Quality:link as integer %q: %w", qlink, err) + } + + qlevel, err := strconv.Atoi(strings.TrimSuffix(stats[2], ".")) + if err != nil { + return nil, fmt.Errorf("failed to parse Quality:level as integer %q: %w", qlevel, err) + } + + qnoise, err := strconv.Atoi(strings.TrimSuffix(stats[3], ".")) + if err != nil { + return nil, fmt.Errorf("failed to parse Quality:noise as integer %q: %w", qnoise, err) + } + + dnwid, err := strconv.Atoi(stats[4]) + if err != nil { + return nil, fmt.Errorf("failed to parse Discarded:nwid as integer %q: %w", dnwid, err) + } + + dcrypt, err := strconv.Atoi(stats[5]) + if err != nil { + return nil, fmt.Errorf("failed to parse Discarded:crypt as integer %q: %w", dcrypt, err) + } + + dfrag, err := strconv.Atoi(stats[6]) + if err != nil { + return nil, fmt.Errorf("failed to parse Discarded:frag as integer %q: %w", dfrag, err) + } + + dretry, err := strconv.Atoi(stats[7]) + if err != nil { + return nil, fmt.Errorf("failed to parse Discarded:retry as integer %q: %w", dretry, err) + } + + dmisc, err := strconv.Atoi(stats[8]) + if err != nil { + return nil, fmt.Errorf("failed to parse Discarded:misc as integer %q: %w", dmisc, err) + } + + mbeacon, err := strconv.Atoi(stats[9]) + if err != nil { + return nil, fmt.Errorf("failed to parse Missed:beacon as integer %q: %w", mbeacon, err) + } + + w := &Wireless{ + Name: name, + Status: status, + QualityLink: qlink, + QualityLevel: qlevel, + QualityNoise: qnoise, + DiscardedNwid: dnwid, + DiscardedCrypt: dcrypt, + DiscardedFrag: dfrag, + DiscardedRetry: dretry, + DiscardedMisc: dmisc, + MissedBeacon: mbeacon, + } + + interfaces = append(interfaces, w) + } + + if err := scanner.Err(); err != nil { + return nil, fmt.Errorf("failed to scan /proc/net/wireless: %w", err) + } + + return interfaces, nil +} diff --git a/vendor/github.com/prometheus/procfs/netstat.go b/vendor/github.com/prometheus/procfs/netstat.go index dcea9c5a671f..742dff453ba8 100644 --- a/vendor/github.com/prometheus/procfs/netstat.go +++ b/vendor/github.com/prometheus/procfs/netstat.go @@ -37,32 +37,46 @@ func (fs FS) NetStat() ([]NetStat, error) { var netStatsTotal []NetStat for _, filePath := range statFiles { - file, err := os.Open(filePath) + procNetstat, err := parseNetstat(filePath) if err != nil { return nil, err } + procNetstat.Filename = filepath.Base(filePath) - netStatFile := NetStat{ - Filename: filepath.Base(filePath), - Stats: make(map[string][]uint64), - } - scanner := bufio.NewScanner(file) - scanner.Scan() - // First string is always a header for stats - var headers []string - headers = append(headers, strings.Fields(scanner.Text())...) + netStatsTotal = append(netStatsTotal, procNetstat) + } + return netStatsTotal, nil +} + +// parseNetstat parses the metrics from `/proc/net/stat/` file +// and returns a NetStat structure. +func parseNetstat(filePath string) (NetStat, error) { + netStat := NetStat{ + Stats: make(map[string][]uint64), + } + file, err := os.Open(filePath) + if err != nil { + return netStat, err + } + defer file.Close() + + scanner := bufio.NewScanner(file) + scanner.Scan() - // Other strings represent per-CPU counters - for scanner.Scan() { - for num, counter := range strings.Fields(scanner.Text()) { - value, err := strconv.ParseUint(counter, 16, 64) - if err != nil { - return nil, err - } - netStatFile.Stats[headers[num]] = append(netStatFile.Stats[headers[num]], value) + // First string is always a header for stats + var headers []string + headers = append(headers, strings.Fields(scanner.Text())...) + + // Other strings represent per-CPU counters + for scanner.Scan() { + for num, counter := range strings.Fields(scanner.Text()) { + value, err := strconv.ParseUint(counter, 16, 64) + if err != nil { + return NetStat{}, err } + netStat.Stats[headers[num]] = append(netStat.Stats[headers[num]], value) } - netStatsTotal = append(netStatsTotal, netStatFile) } - return netStatsTotal, nil + + return netStat, nil } diff --git a/vendor/github.com/prometheus/procfs/proc.go b/vendor/github.com/prometheus/procfs/proc.go index c30223af72ad..48f39dafd2aa 100644 --- a/vendor/github.com/prometheus/procfs/proc.go +++ b/vendor/github.com/prometheus/procfs/proc.go @@ -21,7 +21,6 @@ import ( "strconv" "strings" - "github.com/prometheus/procfs/internal/fs" "github.com/prometheus/procfs/internal/util" ) @@ -30,7 +29,7 @@ type Proc struct { // The process ID. PID int - fs fs.FS + fs FS } // Procs represents a list of Proc structs. @@ -92,7 +91,7 @@ func (fs FS) Proc(pid int) (Proc, error) { if _, err := os.Stat(fs.proc.Path(strconv.Itoa(pid))); err != nil { return Proc{}, err } - return Proc{PID: pid, fs: fs.proc}, nil + return Proc{PID: pid, fs: fs}, nil } // AllProcs returns a list of all currently available processes. @@ -114,7 +113,7 @@ func (fs FS) AllProcs() (Procs, error) { if err != nil { continue } - p = append(p, Proc{PID: int(pid), fs: fs.proc}) + p = append(p, Proc{PID: int(pid), fs: fs}) } return p, nil @@ -237,6 +236,19 @@ func (p Proc) FileDescriptorTargets() ([]string, error) { // FileDescriptorsLen returns the number of currently open file descriptors of // a process. func (p Proc) FileDescriptorsLen() (int, error) { + // Use fast path if available (Linux v6.2): https://github.com/torvalds/linux/commit/f1f1f2569901 + if p.fs.real { + stat, err := os.Stat(p.path("fd")) + if err != nil { + return 0, err + } + + size := stat.Size() + if size > 0 { + return int(size), nil + } + } + fds, err := p.fileDescriptors() if err != nil { return 0, err @@ -285,7 +297,7 @@ func (p Proc) fileDescriptors() ([]string, error) { } func (p Proc) path(pa ...string) string { - return p.fs.Path(append([]string{strconv.Itoa(p.PID)}, pa...)...) + return p.fs.proc.Path(append([]string{strconv.Itoa(p.PID)}, pa...)...) } // FileDescriptorsInfo retrieves information about all file descriptors of diff --git a/vendor/github.com/prometheus/procfs/proc_cgroup.go b/vendor/github.com/prometheus/procfs/proc_cgroup.go index cca03327c3fe..ea83a75ffc42 100644 --- a/vendor/github.com/prometheus/procfs/proc_cgroup.go +++ b/vendor/github.com/prometheus/procfs/proc_cgroup.go @@ -23,7 +23,7 @@ import ( "github.com/prometheus/procfs/internal/util" ) -// Cgroup models one line from /proc/[pid]/cgroup. Each Cgroup struct describes the the placement of a PID inside a +// Cgroup models one line from /proc/[pid]/cgroup. Each Cgroup struct describes the placement of a PID inside a // specific control hierarchy. The kernel has two cgroup APIs, v1 and v2. v1 has one hierarchy per available resource // controller, while v2 has one unified hierarchy shared by all controllers. Regardless of v1 or v2, all hierarchies // contain all running processes, so the question answerable with a Cgroup struct is 'where is this process in diff --git a/vendor/github.com/prometheus/procfs/proc_interrupts.go b/vendor/github.com/prometheus/procfs/proc_interrupts.go new file mode 100644 index 000000000000..9df79c237999 --- /dev/null +++ b/vendor/github.com/prometheus/procfs/proc_interrupts.go @@ -0,0 +1,98 @@ +// Copyright 2022 The Prometheus Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package procfs + +import ( + "bufio" + "bytes" + "errors" + "fmt" + "io" + "strconv" + "strings" + + "github.com/prometheus/procfs/internal/util" +) + +// Interrupt represents a single interrupt line. +type Interrupt struct { + // Info is the type of interrupt. + Info string + // Devices is the name of the device that is located at that IRQ + Devices string + // Values is the number of interrupts per CPU. + Values []string +} + +// Interrupts models the content of /proc/interrupts. Key is the IRQ number. +// - https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/6/html/deployment_guide/s2-proc-interrupts +// - https://raspberrypi.stackexchange.com/questions/105802/explanation-of-proc-interrupts-output +type Interrupts map[string]Interrupt + +// Interrupts creates a new instance from a given Proc instance. +func (p Proc) Interrupts() (Interrupts, error) { + data, err := util.ReadFileNoStat(p.path("interrupts")) + if err != nil { + return nil, err + } + return parseInterrupts(bytes.NewReader(data)) +} + +func parseInterrupts(r io.Reader) (Interrupts, error) { + var ( + interrupts = Interrupts{} + scanner = bufio.NewScanner(r) + ) + + if !scanner.Scan() { + return nil, errors.New("interrupts empty") + } + cpuNum := len(strings.Fields(scanner.Text())) // one header per cpu + + for scanner.Scan() { + parts := strings.Fields(scanner.Text()) + if len(parts) == 0 { // skip empty lines + continue + } + if len(parts) < 2 { + return nil, fmt.Errorf("not enough fields in interrupts (expected at least 2 fields but got %d): %s", len(parts), parts) + } + intName := parts[0][:len(parts[0])-1] // remove trailing : + + if len(parts) == 2 { + interrupts[intName] = Interrupt{ + Info: "", + Devices: "", + Values: []string{ + parts[1], + }, + } + continue + } + + intr := Interrupt{ + Values: parts[1 : cpuNum+1], + } + + if _, err := strconv.Atoi(intName); err == nil { // numeral interrupt + intr.Info = parts[cpuNum+1] + intr.Devices = strings.Join(parts[cpuNum+2:], " ") + } else { + intr.Info = strings.Join(parts[cpuNum+1:], " ") + } + interrupts[intName] = intr + } + + return interrupts, scanner.Err() +} diff --git a/vendor/github.com/prometheus/procfs/proc_netstat.go b/vendor/github.com/prometheus/procfs/proc_netstat.go index 48b5238194e8..6a43bb245951 100644 --- a/vendor/github.com/prometheus/procfs/proc_netstat.go +++ b/vendor/github.com/prometheus/procfs/proc_netstat.go @@ -33,139 +33,140 @@ type ProcNetstat struct { } type TcpExt struct { // nolint:revive - SyncookiesSent float64 - SyncookiesRecv float64 - SyncookiesFailed float64 - EmbryonicRsts float64 - PruneCalled float64 - RcvPruned float64 - OfoPruned float64 - OutOfWindowIcmps float64 - LockDroppedIcmps float64 - ArpFilter float64 - TW float64 - TWRecycled float64 - TWKilled float64 - PAWSActive float64 - PAWSEstab float64 - DelayedACKs float64 - DelayedACKLocked float64 - DelayedACKLost float64 - ListenOverflows float64 - ListenDrops float64 - TCPHPHits float64 - TCPPureAcks float64 - TCPHPAcks float64 - TCPRenoRecovery float64 - TCPSackRecovery float64 - TCPSACKReneging float64 - TCPSACKReorder float64 - TCPRenoReorder float64 - TCPTSReorder float64 - TCPFullUndo float64 - TCPPartialUndo float64 - TCPDSACKUndo float64 - TCPLossUndo float64 - TCPLostRetransmit float64 - TCPRenoFailures float64 - TCPSackFailures float64 - TCPLossFailures float64 - TCPFastRetrans float64 - TCPSlowStartRetrans float64 - TCPTimeouts float64 - TCPLossProbes float64 - TCPLossProbeRecovery float64 - TCPRenoRecoveryFail float64 - TCPSackRecoveryFail float64 - TCPRcvCollapsed float64 - TCPDSACKOldSent float64 - TCPDSACKOfoSent float64 - TCPDSACKRecv float64 - TCPDSACKOfoRecv float64 - TCPAbortOnData float64 - TCPAbortOnClose float64 - TCPAbortOnMemory float64 - TCPAbortOnTimeout float64 - TCPAbortOnLinger float64 - TCPAbortFailed float64 - TCPMemoryPressures float64 - TCPMemoryPressuresChrono float64 - TCPSACKDiscard float64 - TCPDSACKIgnoredOld float64 - TCPDSACKIgnoredNoUndo float64 - TCPSpuriousRTOs float64 - TCPMD5NotFound float64 - TCPMD5Unexpected float64 - TCPMD5Failure float64 - TCPSackShifted float64 - TCPSackMerged float64 - TCPSackShiftFallback float64 - TCPBacklogDrop float64 - PFMemallocDrop float64 - TCPMinTTLDrop float64 - TCPDeferAcceptDrop float64 - IPReversePathFilter float64 - TCPTimeWaitOverflow float64 - TCPReqQFullDoCookies float64 - TCPReqQFullDrop float64 - TCPRetransFail float64 - TCPRcvCoalesce float64 - TCPOFOQueue float64 - TCPOFODrop float64 - TCPOFOMerge float64 - TCPChallengeACK float64 - TCPSYNChallenge float64 - TCPFastOpenActive float64 - TCPFastOpenActiveFail float64 - TCPFastOpenPassive float64 - TCPFastOpenPassiveFail float64 - TCPFastOpenListenOverflow float64 - TCPFastOpenCookieReqd float64 - TCPFastOpenBlackhole float64 - TCPSpuriousRtxHostQueues float64 - BusyPollRxPackets float64 - TCPAutoCorking float64 - TCPFromZeroWindowAdv float64 - TCPToZeroWindowAdv float64 - TCPWantZeroWindowAdv float64 - TCPSynRetrans float64 - TCPOrigDataSent float64 - TCPHystartTrainDetect float64 - TCPHystartTrainCwnd float64 - TCPHystartDelayDetect float64 - TCPHystartDelayCwnd float64 - TCPACKSkippedSynRecv float64 - TCPACKSkippedPAWS float64 - TCPACKSkippedSeq float64 - TCPACKSkippedFinWait2 float64 - TCPACKSkippedTimeWait float64 - TCPACKSkippedChallenge float64 - TCPWinProbe float64 - TCPKeepAlive float64 - TCPMTUPFail float64 - TCPMTUPSuccess float64 - TCPWqueueTooBig float64 + SyncookiesSent *float64 + SyncookiesRecv *float64 + SyncookiesFailed *float64 + EmbryonicRsts *float64 + PruneCalled *float64 + RcvPruned *float64 + OfoPruned *float64 + OutOfWindowIcmps *float64 + LockDroppedIcmps *float64 + ArpFilter *float64 + TW *float64 + TWRecycled *float64 + TWKilled *float64 + PAWSActive *float64 + PAWSEstab *float64 + DelayedACKs *float64 + DelayedACKLocked *float64 + DelayedACKLost *float64 + ListenOverflows *float64 + ListenDrops *float64 + TCPHPHits *float64 + TCPPureAcks *float64 + TCPHPAcks *float64 + TCPRenoRecovery *float64 + TCPSackRecovery *float64 + TCPSACKReneging *float64 + TCPSACKReorder *float64 + TCPRenoReorder *float64 + TCPTSReorder *float64 + TCPFullUndo *float64 + TCPPartialUndo *float64 + TCPDSACKUndo *float64 + TCPLossUndo *float64 + TCPLostRetransmit *float64 + TCPRenoFailures *float64 + TCPSackFailures *float64 + TCPLossFailures *float64 + TCPFastRetrans *float64 + TCPSlowStartRetrans *float64 + TCPTimeouts *float64 + TCPLossProbes *float64 + TCPLossProbeRecovery *float64 + TCPRenoRecoveryFail *float64 + TCPSackRecoveryFail *float64 + TCPRcvCollapsed *float64 + TCPDSACKOldSent *float64 + TCPDSACKOfoSent *float64 + TCPDSACKRecv *float64 + TCPDSACKOfoRecv *float64 + TCPAbortOnData *float64 + TCPAbortOnClose *float64 + TCPAbortOnMemory *float64 + TCPAbortOnTimeout *float64 + TCPAbortOnLinger *float64 + TCPAbortFailed *float64 + TCPMemoryPressures *float64 + TCPMemoryPressuresChrono *float64 + TCPSACKDiscard *float64 + TCPDSACKIgnoredOld *float64 + TCPDSACKIgnoredNoUndo *float64 + TCPSpuriousRTOs *float64 + TCPMD5NotFound *float64 + TCPMD5Unexpected *float64 + TCPMD5Failure *float64 + TCPSackShifted *float64 + TCPSackMerged *float64 + TCPSackShiftFallback *float64 + TCPBacklogDrop *float64 + PFMemallocDrop *float64 + TCPMinTTLDrop *float64 + TCPDeferAcceptDrop *float64 + IPReversePathFilter *float64 + TCPTimeWaitOverflow *float64 + TCPReqQFullDoCookies *float64 + TCPReqQFullDrop *float64 + TCPRetransFail *float64 + TCPRcvCoalesce *float64 + TCPRcvQDrop *float64 + TCPOFOQueue *float64 + TCPOFODrop *float64 + TCPOFOMerge *float64 + TCPChallengeACK *float64 + TCPSYNChallenge *float64 + TCPFastOpenActive *float64 + TCPFastOpenActiveFail *float64 + TCPFastOpenPassive *float64 + TCPFastOpenPassiveFail *float64 + TCPFastOpenListenOverflow *float64 + TCPFastOpenCookieReqd *float64 + TCPFastOpenBlackhole *float64 + TCPSpuriousRtxHostQueues *float64 + BusyPollRxPackets *float64 + TCPAutoCorking *float64 + TCPFromZeroWindowAdv *float64 + TCPToZeroWindowAdv *float64 + TCPWantZeroWindowAdv *float64 + TCPSynRetrans *float64 + TCPOrigDataSent *float64 + TCPHystartTrainDetect *float64 + TCPHystartTrainCwnd *float64 + TCPHystartDelayDetect *float64 + TCPHystartDelayCwnd *float64 + TCPACKSkippedSynRecv *float64 + TCPACKSkippedPAWS *float64 + TCPACKSkippedSeq *float64 + TCPACKSkippedFinWait2 *float64 + TCPACKSkippedTimeWait *float64 + TCPACKSkippedChallenge *float64 + TCPWinProbe *float64 + TCPKeepAlive *float64 + TCPMTUPFail *float64 + TCPMTUPSuccess *float64 + TCPWqueueTooBig *float64 } type IpExt struct { // nolint:revive - InNoRoutes float64 - InTruncatedPkts float64 - InMcastPkts float64 - OutMcastPkts float64 - InBcastPkts float64 - OutBcastPkts float64 - InOctets float64 - OutOctets float64 - InMcastOctets float64 - OutMcastOctets float64 - InBcastOctets float64 - OutBcastOctets float64 - InCsumErrors float64 - InNoECTPkts float64 - InECT1Pkts float64 - InECT0Pkts float64 - InCEPkts float64 - ReasmOverlaps float64 + InNoRoutes *float64 + InTruncatedPkts *float64 + InMcastPkts *float64 + OutMcastPkts *float64 + InBcastPkts *float64 + OutBcastPkts *float64 + InOctets *float64 + OutOctets *float64 + InMcastOctets *float64 + OutMcastOctets *float64 + InBcastOctets *float64 + OutBcastOctets *float64 + InCsumErrors *float64 + InNoECTPkts *float64 + InECT1Pkts *float64 + InECT0Pkts *float64 + InCEPkts *float64 + ReasmOverlaps *float64 } func (p Proc) Netstat() (ProcNetstat, error) { @@ -174,14 +175,14 @@ func (p Proc) Netstat() (ProcNetstat, error) { if err != nil { return ProcNetstat{PID: p.PID}, err } - procNetstat, err := parseNetstat(bytes.NewReader(data), filename) + procNetstat, err := parseProcNetstat(bytes.NewReader(data), filename) procNetstat.PID = p.PID return procNetstat, err } -// parseNetstat parses the metrics from proc//net/netstat file +// parseProcNetstat parses the metrics from proc//net/netstat file // and returns a ProcNetstat structure. -func parseNetstat(r io.Reader, fileName string) (ProcNetstat, error) { +func parseProcNetstat(r io.Reader, fileName string) (ProcNetstat, error) { var ( scanner = bufio.NewScanner(r) procNetstat = ProcNetstat{} @@ -208,230 +209,232 @@ func parseNetstat(r io.Reader, fileName string) (ProcNetstat, error) { case "TcpExt": switch key { case "SyncookiesSent": - procNetstat.TcpExt.SyncookiesSent = value + procNetstat.TcpExt.SyncookiesSent = &value case "SyncookiesRecv": - procNetstat.TcpExt.SyncookiesRecv = value + procNetstat.TcpExt.SyncookiesRecv = &value case "SyncookiesFailed": - procNetstat.TcpExt.SyncookiesFailed = value + procNetstat.TcpExt.SyncookiesFailed = &value case "EmbryonicRsts": - procNetstat.TcpExt.EmbryonicRsts = value + procNetstat.TcpExt.EmbryonicRsts = &value case "PruneCalled": - procNetstat.TcpExt.PruneCalled = value + procNetstat.TcpExt.PruneCalled = &value case "RcvPruned": - procNetstat.TcpExt.RcvPruned = value + procNetstat.TcpExt.RcvPruned = &value case "OfoPruned": - procNetstat.TcpExt.OfoPruned = value + procNetstat.TcpExt.OfoPruned = &value case "OutOfWindowIcmps": - procNetstat.TcpExt.OutOfWindowIcmps = value + procNetstat.TcpExt.OutOfWindowIcmps = &value case "LockDroppedIcmps": - procNetstat.TcpExt.LockDroppedIcmps = value + procNetstat.TcpExt.LockDroppedIcmps = &value case "ArpFilter": - procNetstat.TcpExt.ArpFilter = value + procNetstat.TcpExt.ArpFilter = &value case "TW": - procNetstat.TcpExt.TW = value + procNetstat.TcpExt.TW = &value case "TWRecycled": - procNetstat.TcpExt.TWRecycled = value + procNetstat.TcpExt.TWRecycled = &value case "TWKilled": - procNetstat.TcpExt.TWKilled = value + procNetstat.TcpExt.TWKilled = &value case "PAWSActive": - procNetstat.TcpExt.PAWSActive = value + procNetstat.TcpExt.PAWSActive = &value case "PAWSEstab": - procNetstat.TcpExt.PAWSEstab = value + procNetstat.TcpExt.PAWSEstab = &value case "DelayedACKs": - procNetstat.TcpExt.DelayedACKs = value + procNetstat.TcpExt.DelayedACKs = &value case "DelayedACKLocked": - procNetstat.TcpExt.DelayedACKLocked = value + procNetstat.TcpExt.DelayedACKLocked = &value case "DelayedACKLost": - procNetstat.TcpExt.DelayedACKLost = value + procNetstat.TcpExt.DelayedACKLost = &value case "ListenOverflows": - procNetstat.TcpExt.ListenOverflows = value + procNetstat.TcpExt.ListenOverflows = &value case "ListenDrops": - procNetstat.TcpExt.ListenDrops = value + procNetstat.TcpExt.ListenDrops = &value case "TCPHPHits": - procNetstat.TcpExt.TCPHPHits = value + procNetstat.TcpExt.TCPHPHits = &value case "TCPPureAcks": - procNetstat.TcpExt.TCPPureAcks = value + procNetstat.TcpExt.TCPPureAcks = &value case "TCPHPAcks": - procNetstat.TcpExt.TCPHPAcks = value + procNetstat.TcpExt.TCPHPAcks = &value case "TCPRenoRecovery": - procNetstat.TcpExt.TCPRenoRecovery = value + procNetstat.TcpExt.TCPRenoRecovery = &value case "TCPSackRecovery": - procNetstat.TcpExt.TCPSackRecovery = value + procNetstat.TcpExt.TCPSackRecovery = &value case "TCPSACKReneging": - procNetstat.TcpExt.TCPSACKReneging = value + procNetstat.TcpExt.TCPSACKReneging = &value case "TCPSACKReorder": - procNetstat.TcpExt.TCPSACKReorder = value + procNetstat.TcpExt.TCPSACKReorder = &value case "TCPRenoReorder": - procNetstat.TcpExt.TCPRenoReorder = value + procNetstat.TcpExt.TCPRenoReorder = &value case "TCPTSReorder": - procNetstat.TcpExt.TCPTSReorder = value + procNetstat.TcpExt.TCPTSReorder = &value case "TCPFullUndo": - procNetstat.TcpExt.TCPFullUndo = value + procNetstat.TcpExt.TCPFullUndo = &value case "TCPPartialUndo": - procNetstat.TcpExt.TCPPartialUndo = value + procNetstat.TcpExt.TCPPartialUndo = &value case "TCPDSACKUndo": - procNetstat.TcpExt.TCPDSACKUndo = value + procNetstat.TcpExt.TCPDSACKUndo = &value case "TCPLossUndo": - procNetstat.TcpExt.TCPLossUndo = value + procNetstat.TcpExt.TCPLossUndo = &value case "TCPLostRetransmit": - procNetstat.TcpExt.TCPLostRetransmit = value + procNetstat.TcpExt.TCPLostRetransmit = &value case "TCPRenoFailures": - procNetstat.TcpExt.TCPRenoFailures = value + procNetstat.TcpExt.TCPRenoFailures = &value case "TCPSackFailures": - procNetstat.TcpExt.TCPSackFailures = value + procNetstat.TcpExt.TCPSackFailures = &value case "TCPLossFailures": - procNetstat.TcpExt.TCPLossFailures = value + procNetstat.TcpExt.TCPLossFailures = &value case "TCPFastRetrans": - procNetstat.TcpExt.TCPFastRetrans = value + procNetstat.TcpExt.TCPFastRetrans = &value case "TCPSlowStartRetrans": - procNetstat.TcpExt.TCPSlowStartRetrans = value + procNetstat.TcpExt.TCPSlowStartRetrans = &value case "TCPTimeouts": - procNetstat.TcpExt.TCPTimeouts = value + procNetstat.TcpExt.TCPTimeouts = &value case "TCPLossProbes": - procNetstat.TcpExt.TCPLossProbes = value + procNetstat.TcpExt.TCPLossProbes = &value case "TCPLossProbeRecovery": - procNetstat.TcpExt.TCPLossProbeRecovery = value + procNetstat.TcpExt.TCPLossProbeRecovery = &value case "TCPRenoRecoveryFail": - procNetstat.TcpExt.TCPRenoRecoveryFail = value + procNetstat.TcpExt.TCPRenoRecoveryFail = &value case "TCPSackRecoveryFail": - procNetstat.TcpExt.TCPSackRecoveryFail = value + procNetstat.TcpExt.TCPSackRecoveryFail = &value case "TCPRcvCollapsed": - procNetstat.TcpExt.TCPRcvCollapsed = value + procNetstat.TcpExt.TCPRcvCollapsed = &value case "TCPDSACKOldSent": - procNetstat.TcpExt.TCPDSACKOldSent = value + procNetstat.TcpExt.TCPDSACKOldSent = &value case "TCPDSACKOfoSent": - procNetstat.TcpExt.TCPDSACKOfoSent = value + procNetstat.TcpExt.TCPDSACKOfoSent = &value case "TCPDSACKRecv": - procNetstat.TcpExt.TCPDSACKRecv = value + procNetstat.TcpExt.TCPDSACKRecv = &value case "TCPDSACKOfoRecv": - procNetstat.TcpExt.TCPDSACKOfoRecv = value + procNetstat.TcpExt.TCPDSACKOfoRecv = &value case "TCPAbortOnData": - procNetstat.TcpExt.TCPAbortOnData = value + procNetstat.TcpExt.TCPAbortOnData = &value case "TCPAbortOnClose": - procNetstat.TcpExt.TCPAbortOnClose = value + procNetstat.TcpExt.TCPAbortOnClose = &value case "TCPDeferAcceptDrop": - procNetstat.TcpExt.TCPDeferAcceptDrop = value + procNetstat.TcpExt.TCPDeferAcceptDrop = &value case "IPReversePathFilter": - procNetstat.TcpExt.IPReversePathFilter = value + procNetstat.TcpExt.IPReversePathFilter = &value case "TCPTimeWaitOverflow": - procNetstat.TcpExt.TCPTimeWaitOverflow = value + procNetstat.TcpExt.TCPTimeWaitOverflow = &value case "TCPReqQFullDoCookies": - procNetstat.TcpExt.TCPReqQFullDoCookies = value + procNetstat.TcpExt.TCPReqQFullDoCookies = &value case "TCPReqQFullDrop": - procNetstat.TcpExt.TCPReqQFullDrop = value + procNetstat.TcpExt.TCPReqQFullDrop = &value case "TCPRetransFail": - procNetstat.TcpExt.TCPRetransFail = value + procNetstat.TcpExt.TCPRetransFail = &value case "TCPRcvCoalesce": - procNetstat.TcpExt.TCPRcvCoalesce = value + procNetstat.TcpExt.TCPRcvCoalesce = &value + case "TCPRcvQDrop": + procNetstat.TcpExt.TCPRcvQDrop = &value case "TCPOFOQueue": - procNetstat.TcpExt.TCPOFOQueue = value + procNetstat.TcpExt.TCPOFOQueue = &value case "TCPOFODrop": - procNetstat.TcpExt.TCPOFODrop = value + procNetstat.TcpExt.TCPOFODrop = &value case "TCPOFOMerge": - procNetstat.TcpExt.TCPOFOMerge = value + procNetstat.TcpExt.TCPOFOMerge = &value case "TCPChallengeACK": - procNetstat.TcpExt.TCPChallengeACK = value + procNetstat.TcpExt.TCPChallengeACK = &value case "TCPSYNChallenge": - procNetstat.TcpExt.TCPSYNChallenge = value + procNetstat.TcpExt.TCPSYNChallenge = &value case "TCPFastOpenActive": - procNetstat.TcpExt.TCPFastOpenActive = value + procNetstat.TcpExt.TCPFastOpenActive = &value case "TCPFastOpenActiveFail": - procNetstat.TcpExt.TCPFastOpenActiveFail = value + procNetstat.TcpExt.TCPFastOpenActiveFail = &value case "TCPFastOpenPassive": - procNetstat.TcpExt.TCPFastOpenPassive = value + procNetstat.TcpExt.TCPFastOpenPassive = &value case "TCPFastOpenPassiveFail": - procNetstat.TcpExt.TCPFastOpenPassiveFail = value + procNetstat.TcpExt.TCPFastOpenPassiveFail = &value case "TCPFastOpenListenOverflow": - procNetstat.TcpExt.TCPFastOpenListenOverflow = value + procNetstat.TcpExt.TCPFastOpenListenOverflow = &value case "TCPFastOpenCookieReqd": - procNetstat.TcpExt.TCPFastOpenCookieReqd = value + procNetstat.TcpExt.TCPFastOpenCookieReqd = &value case "TCPFastOpenBlackhole": - procNetstat.TcpExt.TCPFastOpenBlackhole = value + procNetstat.TcpExt.TCPFastOpenBlackhole = &value case "TCPSpuriousRtxHostQueues": - procNetstat.TcpExt.TCPSpuriousRtxHostQueues = value + procNetstat.TcpExt.TCPSpuriousRtxHostQueues = &value case "BusyPollRxPackets": - procNetstat.TcpExt.BusyPollRxPackets = value + procNetstat.TcpExt.BusyPollRxPackets = &value case "TCPAutoCorking": - procNetstat.TcpExt.TCPAutoCorking = value + procNetstat.TcpExt.TCPAutoCorking = &value case "TCPFromZeroWindowAdv": - procNetstat.TcpExt.TCPFromZeroWindowAdv = value + procNetstat.TcpExt.TCPFromZeroWindowAdv = &value case "TCPToZeroWindowAdv": - procNetstat.TcpExt.TCPToZeroWindowAdv = value + procNetstat.TcpExt.TCPToZeroWindowAdv = &value case "TCPWantZeroWindowAdv": - procNetstat.TcpExt.TCPWantZeroWindowAdv = value + procNetstat.TcpExt.TCPWantZeroWindowAdv = &value case "TCPSynRetrans": - procNetstat.TcpExt.TCPSynRetrans = value + procNetstat.TcpExt.TCPSynRetrans = &value case "TCPOrigDataSent": - procNetstat.TcpExt.TCPOrigDataSent = value + procNetstat.TcpExt.TCPOrigDataSent = &value case "TCPHystartTrainDetect": - procNetstat.TcpExt.TCPHystartTrainDetect = value + procNetstat.TcpExt.TCPHystartTrainDetect = &value case "TCPHystartTrainCwnd": - procNetstat.TcpExt.TCPHystartTrainCwnd = value + procNetstat.TcpExt.TCPHystartTrainCwnd = &value case "TCPHystartDelayDetect": - procNetstat.TcpExt.TCPHystartDelayDetect = value + procNetstat.TcpExt.TCPHystartDelayDetect = &value case "TCPHystartDelayCwnd": - procNetstat.TcpExt.TCPHystartDelayCwnd = value + procNetstat.TcpExt.TCPHystartDelayCwnd = &value case "TCPACKSkippedSynRecv": - procNetstat.TcpExt.TCPACKSkippedSynRecv = value + procNetstat.TcpExt.TCPACKSkippedSynRecv = &value case "TCPACKSkippedPAWS": - procNetstat.TcpExt.TCPACKSkippedPAWS = value + procNetstat.TcpExt.TCPACKSkippedPAWS = &value case "TCPACKSkippedSeq": - procNetstat.TcpExt.TCPACKSkippedSeq = value + procNetstat.TcpExt.TCPACKSkippedSeq = &value case "TCPACKSkippedFinWait2": - procNetstat.TcpExt.TCPACKSkippedFinWait2 = value + procNetstat.TcpExt.TCPACKSkippedFinWait2 = &value case "TCPACKSkippedTimeWait": - procNetstat.TcpExt.TCPACKSkippedTimeWait = value + procNetstat.TcpExt.TCPACKSkippedTimeWait = &value case "TCPACKSkippedChallenge": - procNetstat.TcpExt.TCPACKSkippedChallenge = value + procNetstat.TcpExt.TCPACKSkippedChallenge = &value case "TCPWinProbe": - procNetstat.TcpExt.TCPWinProbe = value + procNetstat.TcpExt.TCPWinProbe = &value case "TCPKeepAlive": - procNetstat.TcpExt.TCPKeepAlive = value + procNetstat.TcpExt.TCPKeepAlive = &value case "TCPMTUPFail": - procNetstat.TcpExt.TCPMTUPFail = value + procNetstat.TcpExt.TCPMTUPFail = &value case "TCPMTUPSuccess": - procNetstat.TcpExt.TCPMTUPSuccess = value + procNetstat.TcpExt.TCPMTUPSuccess = &value case "TCPWqueueTooBig": - procNetstat.TcpExt.TCPWqueueTooBig = value + procNetstat.TcpExt.TCPWqueueTooBig = &value } case "IpExt": switch key { case "InNoRoutes": - procNetstat.IpExt.InNoRoutes = value + procNetstat.IpExt.InNoRoutes = &value case "InTruncatedPkts": - procNetstat.IpExt.InTruncatedPkts = value + procNetstat.IpExt.InTruncatedPkts = &value case "InMcastPkts": - procNetstat.IpExt.InMcastPkts = value + procNetstat.IpExt.InMcastPkts = &value case "OutMcastPkts": - procNetstat.IpExt.OutMcastPkts = value + procNetstat.IpExt.OutMcastPkts = &value case "InBcastPkts": - procNetstat.IpExt.InBcastPkts = value + procNetstat.IpExt.InBcastPkts = &value case "OutBcastPkts": - procNetstat.IpExt.OutBcastPkts = value + procNetstat.IpExt.OutBcastPkts = &value case "InOctets": - procNetstat.IpExt.InOctets = value + procNetstat.IpExt.InOctets = &value case "OutOctets": - procNetstat.IpExt.OutOctets = value + procNetstat.IpExt.OutOctets = &value case "InMcastOctets": - procNetstat.IpExt.InMcastOctets = value + procNetstat.IpExt.InMcastOctets = &value case "OutMcastOctets": - procNetstat.IpExt.OutMcastOctets = value + procNetstat.IpExt.OutMcastOctets = &value case "InBcastOctets": - procNetstat.IpExt.InBcastOctets = value + procNetstat.IpExt.InBcastOctets = &value case "OutBcastOctets": - procNetstat.IpExt.OutBcastOctets = value + procNetstat.IpExt.OutBcastOctets = &value case "InCsumErrors": - procNetstat.IpExt.InCsumErrors = value + procNetstat.IpExt.InCsumErrors = &value case "InNoECTPkts": - procNetstat.IpExt.InNoECTPkts = value + procNetstat.IpExt.InNoECTPkts = &value case "InECT1Pkts": - procNetstat.IpExt.InECT1Pkts = value + procNetstat.IpExt.InECT1Pkts = &value case "InECT0Pkts": - procNetstat.IpExt.InECT0Pkts = value + procNetstat.IpExt.InECT0Pkts = &value case "InCEPkts": - procNetstat.IpExt.InCEPkts = value + procNetstat.IpExt.InCEPkts = &value case "ReasmOverlaps": - procNetstat.IpExt.ReasmOverlaps = value + procNetstat.IpExt.ReasmOverlaps = &value } } } diff --git a/vendor/github.com/prometheus/procfs/proc_snmp.go b/vendor/github.com/prometheus/procfs/proc_snmp.go index ae191896cbd7..6c46b718849c 100644 --- a/vendor/github.com/prometheus/procfs/proc_snmp.go +++ b/vendor/github.com/prometheus/procfs/proc_snmp.go @@ -37,100 +37,100 @@ type ProcSnmp struct { } type Ip struct { // nolint:revive - Forwarding float64 - DefaultTTL float64 - InReceives float64 - InHdrErrors float64 - InAddrErrors float64 - ForwDatagrams float64 - InUnknownProtos float64 - InDiscards float64 - InDelivers float64 - OutRequests float64 - OutDiscards float64 - OutNoRoutes float64 - ReasmTimeout float64 - ReasmReqds float64 - ReasmOKs float64 - ReasmFails float64 - FragOKs float64 - FragFails float64 - FragCreates float64 + Forwarding *float64 + DefaultTTL *float64 + InReceives *float64 + InHdrErrors *float64 + InAddrErrors *float64 + ForwDatagrams *float64 + InUnknownProtos *float64 + InDiscards *float64 + InDelivers *float64 + OutRequests *float64 + OutDiscards *float64 + OutNoRoutes *float64 + ReasmTimeout *float64 + ReasmReqds *float64 + ReasmOKs *float64 + ReasmFails *float64 + FragOKs *float64 + FragFails *float64 + FragCreates *float64 } -type Icmp struct { - InMsgs float64 - InErrors float64 - InCsumErrors float64 - InDestUnreachs float64 - InTimeExcds float64 - InParmProbs float64 - InSrcQuenchs float64 - InRedirects float64 - InEchos float64 - InEchoReps float64 - InTimestamps float64 - InTimestampReps float64 - InAddrMasks float64 - InAddrMaskReps float64 - OutMsgs float64 - OutErrors float64 - OutDestUnreachs float64 - OutTimeExcds float64 - OutParmProbs float64 - OutSrcQuenchs float64 - OutRedirects float64 - OutEchos float64 - OutEchoReps float64 - OutTimestamps float64 - OutTimestampReps float64 - OutAddrMasks float64 - OutAddrMaskReps float64 +type Icmp struct { // nolint:revive + InMsgs *float64 + InErrors *float64 + InCsumErrors *float64 + InDestUnreachs *float64 + InTimeExcds *float64 + InParmProbs *float64 + InSrcQuenchs *float64 + InRedirects *float64 + InEchos *float64 + InEchoReps *float64 + InTimestamps *float64 + InTimestampReps *float64 + InAddrMasks *float64 + InAddrMaskReps *float64 + OutMsgs *float64 + OutErrors *float64 + OutDestUnreachs *float64 + OutTimeExcds *float64 + OutParmProbs *float64 + OutSrcQuenchs *float64 + OutRedirects *float64 + OutEchos *float64 + OutEchoReps *float64 + OutTimestamps *float64 + OutTimestampReps *float64 + OutAddrMasks *float64 + OutAddrMaskReps *float64 } type IcmpMsg struct { - InType3 float64 - OutType3 float64 + InType3 *float64 + OutType3 *float64 } type Tcp struct { // nolint:revive - RtoAlgorithm float64 - RtoMin float64 - RtoMax float64 - MaxConn float64 - ActiveOpens float64 - PassiveOpens float64 - AttemptFails float64 - EstabResets float64 - CurrEstab float64 - InSegs float64 - OutSegs float64 - RetransSegs float64 - InErrs float64 - OutRsts float64 - InCsumErrors float64 + RtoAlgorithm *float64 + RtoMin *float64 + RtoMax *float64 + MaxConn *float64 + ActiveOpens *float64 + PassiveOpens *float64 + AttemptFails *float64 + EstabResets *float64 + CurrEstab *float64 + InSegs *float64 + OutSegs *float64 + RetransSegs *float64 + InErrs *float64 + OutRsts *float64 + InCsumErrors *float64 } type Udp struct { // nolint:revive - InDatagrams float64 - NoPorts float64 - InErrors float64 - OutDatagrams float64 - RcvbufErrors float64 - SndbufErrors float64 - InCsumErrors float64 - IgnoredMulti float64 + InDatagrams *float64 + NoPorts *float64 + InErrors *float64 + OutDatagrams *float64 + RcvbufErrors *float64 + SndbufErrors *float64 + InCsumErrors *float64 + IgnoredMulti *float64 } type UdpLite struct { // nolint:revive - InDatagrams float64 - NoPorts float64 - InErrors float64 - OutDatagrams float64 - RcvbufErrors float64 - SndbufErrors float64 - InCsumErrors float64 - IgnoredMulti float64 + InDatagrams *float64 + NoPorts *float64 + InErrors *float64 + OutDatagrams *float64 + RcvbufErrors *float64 + SndbufErrors *float64 + InCsumErrors *float64 + IgnoredMulti *float64 } func (p Proc) Snmp() (ProcSnmp, error) { @@ -173,178 +173,178 @@ func parseSnmp(r io.Reader, fileName string) (ProcSnmp, error) { case "Ip": switch key { case "Forwarding": - procSnmp.Ip.Forwarding = value + procSnmp.Ip.Forwarding = &value case "DefaultTTL": - procSnmp.Ip.DefaultTTL = value + procSnmp.Ip.DefaultTTL = &value case "InReceives": - procSnmp.Ip.InReceives = value + procSnmp.Ip.InReceives = &value case "InHdrErrors": - procSnmp.Ip.InHdrErrors = value + procSnmp.Ip.InHdrErrors = &value case "InAddrErrors": - procSnmp.Ip.InAddrErrors = value + procSnmp.Ip.InAddrErrors = &value case "ForwDatagrams": - procSnmp.Ip.ForwDatagrams = value + procSnmp.Ip.ForwDatagrams = &value case "InUnknownProtos": - procSnmp.Ip.InUnknownProtos = value + procSnmp.Ip.InUnknownProtos = &value case "InDiscards": - procSnmp.Ip.InDiscards = value + procSnmp.Ip.InDiscards = &value case "InDelivers": - procSnmp.Ip.InDelivers = value + procSnmp.Ip.InDelivers = &value case "OutRequests": - procSnmp.Ip.OutRequests = value + procSnmp.Ip.OutRequests = &value case "OutDiscards": - procSnmp.Ip.OutDiscards = value + procSnmp.Ip.OutDiscards = &value case "OutNoRoutes": - procSnmp.Ip.OutNoRoutes = value + procSnmp.Ip.OutNoRoutes = &value case "ReasmTimeout": - procSnmp.Ip.ReasmTimeout = value + procSnmp.Ip.ReasmTimeout = &value case "ReasmReqds": - procSnmp.Ip.ReasmReqds = value + procSnmp.Ip.ReasmReqds = &value case "ReasmOKs": - procSnmp.Ip.ReasmOKs = value + procSnmp.Ip.ReasmOKs = &value case "ReasmFails": - procSnmp.Ip.ReasmFails = value + procSnmp.Ip.ReasmFails = &value case "FragOKs": - procSnmp.Ip.FragOKs = value + procSnmp.Ip.FragOKs = &value case "FragFails": - procSnmp.Ip.FragFails = value + procSnmp.Ip.FragFails = &value case "FragCreates": - procSnmp.Ip.FragCreates = value + procSnmp.Ip.FragCreates = &value } case "Icmp": switch key { case "InMsgs": - procSnmp.Icmp.InMsgs = value + procSnmp.Icmp.InMsgs = &value case "InErrors": - procSnmp.Icmp.InErrors = value + procSnmp.Icmp.InErrors = &value case "InCsumErrors": - procSnmp.Icmp.InCsumErrors = value + procSnmp.Icmp.InCsumErrors = &value case "InDestUnreachs": - procSnmp.Icmp.InDestUnreachs = value + procSnmp.Icmp.InDestUnreachs = &value case "InTimeExcds": - procSnmp.Icmp.InTimeExcds = value + procSnmp.Icmp.InTimeExcds = &value case "InParmProbs": - procSnmp.Icmp.InParmProbs = value + procSnmp.Icmp.InParmProbs = &value case "InSrcQuenchs": - procSnmp.Icmp.InSrcQuenchs = value + procSnmp.Icmp.InSrcQuenchs = &value case "InRedirects": - procSnmp.Icmp.InRedirects = value + procSnmp.Icmp.InRedirects = &value case "InEchos": - procSnmp.Icmp.InEchos = value + procSnmp.Icmp.InEchos = &value case "InEchoReps": - procSnmp.Icmp.InEchoReps = value + procSnmp.Icmp.InEchoReps = &value case "InTimestamps": - procSnmp.Icmp.InTimestamps = value + procSnmp.Icmp.InTimestamps = &value case "InTimestampReps": - procSnmp.Icmp.InTimestampReps = value + procSnmp.Icmp.InTimestampReps = &value case "InAddrMasks": - procSnmp.Icmp.InAddrMasks = value + procSnmp.Icmp.InAddrMasks = &value case "InAddrMaskReps": - procSnmp.Icmp.InAddrMaskReps = value + procSnmp.Icmp.InAddrMaskReps = &value case "OutMsgs": - procSnmp.Icmp.OutMsgs = value + procSnmp.Icmp.OutMsgs = &value case "OutErrors": - procSnmp.Icmp.OutErrors = value + procSnmp.Icmp.OutErrors = &value case "OutDestUnreachs": - procSnmp.Icmp.OutDestUnreachs = value + procSnmp.Icmp.OutDestUnreachs = &value case "OutTimeExcds": - procSnmp.Icmp.OutTimeExcds = value + procSnmp.Icmp.OutTimeExcds = &value case "OutParmProbs": - procSnmp.Icmp.OutParmProbs = value + procSnmp.Icmp.OutParmProbs = &value case "OutSrcQuenchs": - procSnmp.Icmp.OutSrcQuenchs = value + procSnmp.Icmp.OutSrcQuenchs = &value case "OutRedirects": - procSnmp.Icmp.OutRedirects = value + procSnmp.Icmp.OutRedirects = &value case "OutEchos": - procSnmp.Icmp.OutEchos = value + procSnmp.Icmp.OutEchos = &value case "OutEchoReps": - procSnmp.Icmp.OutEchoReps = value + procSnmp.Icmp.OutEchoReps = &value case "OutTimestamps": - procSnmp.Icmp.OutTimestamps = value + procSnmp.Icmp.OutTimestamps = &value case "OutTimestampReps": - procSnmp.Icmp.OutTimestampReps = value + procSnmp.Icmp.OutTimestampReps = &value case "OutAddrMasks": - procSnmp.Icmp.OutAddrMasks = value + procSnmp.Icmp.OutAddrMasks = &value case "OutAddrMaskReps": - procSnmp.Icmp.OutAddrMaskReps = value + procSnmp.Icmp.OutAddrMaskReps = &value } case "IcmpMsg": switch key { case "InType3": - procSnmp.IcmpMsg.InType3 = value + procSnmp.IcmpMsg.InType3 = &value case "OutType3": - procSnmp.IcmpMsg.OutType3 = value + procSnmp.IcmpMsg.OutType3 = &value } case "Tcp": switch key { case "RtoAlgorithm": - procSnmp.Tcp.RtoAlgorithm = value + procSnmp.Tcp.RtoAlgorithm = &value case "RtoMin": - procSnmp.Tcp.RtoMin = value + procSnmp.Tcp.RtoMin = &value case "RtoMax": - procSnmp.Tcp.RtoMax = value + procSnmp.Tcp.RtoMax = &value case "MaxConn": - procSnmp.Tcp.MaxConn = value + procSnmp.Tcp.MaxConn = &value case "ActiveOpens": - procSnmp.Tcp.ActiveOpens = value + procSnmp.Tcp.ActiveOpens = &value case "PassiveOpens": - procSnmp.Tcp.PassiveOpens = value + procSnmp.Tcp.PassiveOpens = &value case "AttemptFails": - procSnmp.Tcp.AttemptFails = value + procSnmp.Tcp.AttemptFails = &value case "EstabResets": - procSnmp.Tcp.EstabResets = value + procSnmp.Tcp.EstabResets = &value case "CurrEstab": - procSnmp.Tcp.CurrEstab = value + procSnmp.Tcp.CurrEstab = &value case "InSegs": - procSnmp.Tcp.InSegs = value + procSnmp.Tcp.InSegs = &value case "OutSegs": - procSnmp.Tcp.OutSegs = value + procSnmp.Tcp.OutSegs = &value case "RetransSegs": - procSnmp.Tcp.RetransSegs = value + procSnmp.Tcp.RetransSegs = &value case "InErrs": - procSnmp.Tcp.InErrs = value + procSnmp.Tcp.InErrs = &value case "OutRsts": - procSnmp.Tcp.OutRsts = value + procSnmp.Tcp.OutRsts = &value case "InCsumErrors": - procSnmp.Tcp.InCsumErrors = value + procSnmp.Tcp.InCsumErrors = &value } case "Udp": switch key { case "InDatagrams": - procSnmp.Udp.InDatagrams = value + procSnmp.Udp.InDatagrams = &value case "NoPorts": - procSnmp.Udp.NoPorts = value + procSnmp.Udp.NoPorts = &value case "InErrors": - procSnmp.Udp.InErrors = value + procSnmp.Udp.InErrors = &value case "OutDatagrams": - procSnmp.Udp.OutDatagrams = value + procSnmp.Udp.OutDatagrams = &value case "RcvbufErrors": - procSnmp.Udp.RcvbufErrors = value + procSnmp.Udp.RcvbufErrors = &value case "SndbufErrors": - procSnmp.Udp.SndbufErrors = value + procSnmp.Udp.SndbufErrors = &value case "InCsumErrors": - procSnmp.Udp.InCsumErrors = value + procSnmp.Udp.InCsumErrors = &value case "IgnoredMulti": - procSnmp.Udp.IgnoredMulti = value + procSnmp.Udp.IgnoredMulti = &value } case "UdpLite": switch key { case "InDatagrams": - procSnmp.UdpLite.InDatagrams = value + procSnmp.UdpLite.InDatagrams = &value case "NoPorts": - procSnmp.UdpLite.NoPorts = value + procSnmp.UdpLite.NoPorts = &value case "InErrors": - procSnmp.UdpLite.InErrors = value + procSnmp.UdpLite.InErrors = &value case "OutDatagrams": - procSnmp.UdpLite.OutDatagrams = value + procSnmp.UdpLite.OutDatagrams = &value case "RcvbufErrors": - procSnmp.UdpLite.RcvbufErrors = value + procSnmp.UdpLite.RcvbufErrors = &value case "SndbufErrors": - procSnmp.UdpLite.SndbufErrors = value + procSnmp.UdpLite.SndbufErrors = &value case "InCsumErrors": - procSnmp.UdpLite.InCsumErrors = value + procSnmp.UdpLite.InCsumErrors = &value case "IgnoredMulti": - procSnmp.UdpLite.IgnoredMulti = value + procSnmp.UdpLite.IgnoredMulti = &value } } } diff --git a/vendor/github.com/prometheus/procfs/proc_snmp6.go b/vendor/github.com/prometheus/procfs/proc_snmp6.go index f611992d52ca..3059cc6a1367 100644 --- a/vendor/github.com/prometheus/procfs/proc_snmp6.go +++ b/vendor/github.com/prometheus/procfs/proc_snmp6.go @@ -36,106 +36,106 @@ type ProcSnmp6 struct { } type Ip6 struct { // nolint:revive - InReceives float64 - InHdrErrors float64 - InTooBigErrors float64 - InNoRoutes float64 - InAddrErrors float64 - InUnknownProtos float64 - InTruncatedPkts float64 - InDiscards float64 - InDelivers float64 - OutForwDatagrams float64 - OutRequests float64 - OutDiscards float64 - OutNoRoutes float64 - ReasmTimeout float64 - ReasmReqds float64 - ReasmOKs float64 - ReasmFails float64 - FragOKs float64 - FragFails float64 - FragCreates float64 - InMcastPkts float64 - OutMcastPkts float64 - InOctets float64 - OutOctets float64 - InMcastOctets float64 - OutMcastOctets float64 - InBcastOctets float64 - OutBcastOctets float64 - InNoECTPkts float64 - InECT1Pkts float64 - InECT0Pkts float64 - InCEPkts float64 + InReceives *float64 + InHdrErrors *float64 + InTooBigErrors *float64 + InNoRoutes *float64 + InAddrErrors *float64 + InUnknownProtos *float64 + InTruncatedPkts *float64 + InDiscards *float64 + InDelivers *float64 + OutForwDatagrams *float64 + OutRequests *float64 + OutDiscards *float64 + OutNoRoutes *float64 + ReasmTimeout *float64 + ReasmReqds *float64 + ReasmOKs *float64 + ReasmFails *float64 + FragOKs *float64 + FragFails *float64 + FragCreates *float64 + InMcastPkts *float64 + OutMcastPkts *float64 + InOctets *float64 + OutOctets *float64 + InMcastOctets *float64 + OutMcastOctets *float64 + InBcastOctets *float64 + OutBcastOctets *float64 + InNoECTPkts *float64 + InECT1Pkts *float64 + InECT0Pkts *float64 + InCEPkts *float64 } type Icmp6 struct { - InMsgs float64 - InErrors float64 - OutMsgs float64 - OutErrors float64 - InCsumErrors float64 - InDestUnreachs float64 - InPktTooBigs float64 - InTimeExcds float64 - InParmProblems float64 - InEchos float64 - InEchoReplies float64 - InGroupMembQueries float64 - InGroupMembResponses float64 - InGroupMembReductions float64 - InRouterSolicits float64 - InRouterAdvertisements float64 - InNeighborSolicits float64 - InNeighborAdvertisements float64 - InRedirects float64 - InMLDv2Reports float64 - OutDestUnreachs float64 - OutPktTooBigs float64 - OutTimeExcds float64 - OutParmProblems float64 - OutEchos float64 - OutEchoReplies float64 - OutGroupMembQueries float64 - OutGroupMembResponses float64 - OutGroupMembReductions float64 - OutRouterSolicits float64 - OutRouterAdvertisements float64 - OutNeighborSolicits float64 - OutNeighborAdvertisements float64 - OutRedirects float64 - OutMLDv2Reports float64 - InType1 float64 - InType134 float64 - InType135 float64 - InType136 float64 - InType143 float64 - OutType133 float64 - OutType135 float64 - OutType136 float64 - OutType143 float64 + InMsgs *float64 + InErrors *float64 + OutMsgs *float64 + OutErrors *float64 + InCsumErrors *float64 + InDestUnreachs *float64 + InPktTooBigs *float64 + InTimeExcds *float64 + InParmProblems *float64 + InEchos *float64 + InEchoReplies *float64 + InGroupMembQueries *float64 + InGroupMembResponses *float64 + InGroupMembReductions *float64 + InRouterSolicits *float64 + InRouterAdvertisements *float64 + InNeighborSolicits *float64 + InNeighborAdvertisements *float64 + InRedirects *float64 + InMLDv2Reports *float64 + OutDestUnreachs *float64 + OutPktTooBigs *float64 + OutTimeExcds *float64 + OutParmProblems *float64 + OutEchos *float64 + OutEchoReplies *float64 + OutGroupMembQueries *float64 + OutGroupMembResponses *float64 + OutGroupMembReductions *float64 + OutRouterSolicits *float64 + OutRouterAdvertisements *float64 + OutNeighborSolicits *float64 + OutNeighborAdvertisements *float64 + OutRedirects *float64 + OutMLDv2Reports *float64 + InType1 *float64 + InType134 *float64 + InType135 *float64 + InType136 *float64 + InType143 *float64 + OutType133 *float64 + OutType135 *float64 + OutType136 *float64 + OutType143 *float64 } type Udp6 struct { // nolint:revive - InDatagrams float64 - NoPorts float64 - InErrors float64 - OutDatagrams float64 - RcvbufErrors float64 - SndbufErrors float64 - InCsumErrors float64 - IgnoredMulti float64 + InDatagrams *float64 + NoPorts *float64 + InErrors *float64 + OutDatagrams *float64 + RcvbufErrors *float64 + SndbufErrors *float64 + InCsumErrors *float64 + IgnoredMulti *float64 } type UdpLite6 struct { // nolint:revive - InDatagrams float64 - NoPorts float64 - InErrors float64 - OutDatagrams float64 - RcvbufErrors float64 - SndbufErrors float64 - InCsumErrors float64 + InDatagrams *float64 + NoPorts *float64 + InErrors *float64 + OutDatagrams *float64 + RcvbufErrors *float64 + SndbufErrors *float64 + InCsumErrors *float64 } func (p Proc) Snmp6() (ProcSnmp6, error) { @@ -182,197 +182,197 @@ func parseSNMP6Stats(r io.Reader) (ProcSnmp6, error) { case "Ip6": switch key { case "InReceives": - procSnmp6.Ip6.InReceives = value + procSnmp6.Ip6.InReceives = &value case "InHdrErrors": - procSnmp6.Ip6.InHdrErrors = value + procSnmp6.Ip6.InHdrErrors = &value case "InTooBigErrors": - procSnmp6.Ip6.InTooBigErrors = value + procSnmp6.Ip6.InTooBigErrors = &value case "InNoRoutes": - procSnmp6.Ip6.InNoRoutes = value + procSnmp6.Ip6.InNoRoutes = &value case "InAddrErrors": - procSnmp6.Ip6.InAddrErrors = value + procSnmp6.Ip6.InAddrErrors = &value case "InUnknownProtos": - procSnmp6.Ip6.InUnknownProtos = value + procSnmp6.Ip6.InUnknownProtos = &value case "InTruncatedPkts": - procSnmp6.Ip6.InTruncatedPkts = value + procSnmp6.Ip6.InTruncatedPkts = &value case "InDiscards": - procSnmp6.Ip6.InDiscards = value + procSnmp6.Ip6.InDiscards = &value case "InDelivers": - procSnmp6.Ip6.InDelivers = value + procSnmp6.Ip6.InDelivers = &value case "OutForwDatagrams": - procSnmp6.Ip6.OutForwDatagrams = value + procSnmp6.Ip6.OutForwDatagrams = &value case "OutRequests": - procSnmp6.Ip6.OutRequests = value + procSnmp6.Ip6.OutRequests = &value case "OutDiscards": - procSnmp6.Ip6.OutDiscards = value + procSnmp6.Ip6.OutDiscards = &value case "OutNoRoutes": - procSnmp6.Ip6.OutNoRoutes = value + procSnmp6.Ip6.OutNoRoutes = &value case "ReasmTimeout": - procSnmp6.Ip6.ReasmTimeout = value + procSnmp6.Ip6.ReasmTimeout = &value case "ReasmReqds": - procSnmp6.Ip6.ReasmReqds = value + procSnmp6.Ip6.ReasmReqds = &value case "ReasmOKs": - procSnmp6.Ip6.ReasmOKs = value + procSnmp6.Ip6.ReasmOKs = &value case "ReasmFails": - procSnmp6.Ip6.ReasmFails = value + procSnmp6.Ip6.ReasmFails = &value case "FragOKs": - procSnmp6.Ip6.FragOKs = value + procSnmp6.Ip6.FragOKs = &value case "FragFails": - procSnmp6.Ip6.FragFails = value + procSnmp6.Ip6.FragFails = &value case "FragCreates": - procSnmp6.Ip6.FragCreates = value + procSnmp6.Ip6.FragCreates = &value case "InMcastPkts": - procSnmp6.Ip6.InMcastPkts = value + procSnmp6.Ip6.InMcastPkts = &value case "OutMcastPkts": - procSnmp6.Ip6.OutMcastPkts = value + procSnmp6.Ip6.OutMcastPkts = &value case "InOctets": - procSnmp6.Ip6.InOctets = value + procSnmp6.Ip6.InOctets = &value case "OutOctets": - procSnmp6.Ip6.OutOctets = value + procSnmp6.Ip6.OutOctets = &value case "InMcastOctets": - procSnmp6.Ip6.InMcastOctets = value + procSnmp6.Ip6.InMcastOctets = &value case "OutMcastOctets": - procSnmp6.Ip6.OutMcastOctets = value + procSnmp6.Ip6.OutMcastOctets = &value case "InBcastOctets": - procSnmp6.Ip6.InBcastOctets = value + procSnmp6.Ip6.InBcastOctets = &value case "OutBcastOctets": - procSnmp6.Ip6.OutBcastOctets = value + procSnmp6.Ip6.OutBcastOctets = &value case "InNoECTPkts": - procSnmp6.Ip6.InNoECTPkts = value + procSnmp6.Ip6.InNoECTPkts = &value case "InECT1Pkts": - procSnmp6.Ip6.InECT1Pkts = value + procSnmp6.Ip6.InECT1Pkts = &value case "InECT0Pkts": - procSnmp6.Ip6.InECT0Pkts = value + procSnmp6.Ip6.InECT0Pkts = &value case "InCEPkts": - procSnmp6.Ip6.InCEPkts = value + procSnmp6.Ip6.InCEPkts = &value } case "Icmp6": switch key { case "InMsgs": - procSnmp6.Icmp6.InMsgs = value + procSnmp6.Icmp6.InMsgs = &value case "InErrors": - procSnmp6.Icmp6.InErrors = value + procSnmp6.Icmp6.InErrors = &value case "OutMsgs": - procSnmp6.Icmp6.OutMsgs = value + procSnmp6.Icmp6.OutMsgs = &value case "OutErrors": - procSnmp6.Icmp6.OutErrors = value + procSnmp6.Icmp6.OutErrors = &value case "InCsumErrors": - procSnmp6.Icmp6.InCsumErrors = value + procSnmp6.Icmp6.InCsumErrors = &value case "InDestUnreachs": - procSnmp6.Icmp6.InDestUnreachs = value + procSnmp6.Icmp6.InDestUnreachs = &value case "InPktTooBigs": - procSnmp6.Icmp6.InPktTooBigs = value + procSnmp6.Icmp6.InPktTooBigs = &value case "InTimeExcds": - procSnmp6.Icmp6.InTimeExcds = value + procSnmp6.Icmp6.InTimeExcds = &value case "InParmProblems": - procSnmp6.Icmp6.InParmProblems = value + procSnmp6.Icmp6.InParmProblems = &value case "InEchos": - procSnmp6.Icmp6.InEchos = value + procSnmp6.Icmp6.InEchos = &value case "InEchoReplies": - procSnmp6.Icmp6.InEchoReplies = value + procSnmp6.Icmp6.InEchoReplies = &value case "InGroupMembQueries": - procSnmp6.Icmp6.InGroupMembQueries = value + procSnmp6.Icmp6.InGroupMembQueries = &value case "InGroupMembResponses": - procSnmp6.Icmp6.InGroupMembResponses = value + procSnmp6.Icmp6.InGroupMembResponses = &value case "InGroupMembReductions": - procSnmp6.Icmp6.InGroupMembReductions = value + procSnmp6.Icmp6.InGroupMembReductions = &value case "InRouterSolicits": - procSnmp6.Icmp6.InRouterSolicits = value + procSnmp6.Icmp6.InRouterSolicits = &value case "InRouterAdvertisements": - procSnmp6.Icmp6.InRouterAdvertisements = value + procSnmp6.Icmp6.InRouterAdvertisements = &value case "InNeighborSolicits": - procSnmp6.Icmp6.InNeighborSolicits = value + procSnmp6.Icmp6.InNeighborSolicits = &value case "InNeighborAdvertisements": - procSnmp6.Icmp6.InNeighborAdvertisements = value + procSnmp6.Icmp6.InNeighborAdvertisements = &value case "InRedirects": - procSnmp6.Icmp6.InRedirects = value + procSnmp6.Icmp6.InRedirects = &value case "InMLDv2Reports": - procSnmp6.Icmp6.InMLDv2Reports = value + procSnmp6.Icmp6.InMLDv2Reports = &value case "OutDestUnreachs": - procSnmp6.Icmp6.OutDestUnreachs = value + procSnmp6.Icmp6.OutDestUnreachs = &value case "OutPktTooBigs": - procSnmp6.Icmp6.OutPktTooBigs = value + procSnmp6.Icmp6.OutPktTooBigs = &value case "OutTimeExcds": - procSnmp6.Icmp6.OutTimeExcds = value + procSnmp6.Icmp6.OutTimeExcds = &value case "OutParmProblems": - procSnmp6.Icmp6.OutParmProblems = value + procSnmp6.Icmp6.OutParmProblems = &value case "OutEchos": - procSnmp6.Icmp6.OutEchos = value + procSnmp6.Icmp6.OutEchos = &value case "OutEchoReplies": - procSnmp6.Icmp6.OutEchoReplies = value + procSnmp6.Icmp6.OutEchoReplies = &value case "OutGroupMembQueries": - procSnmp6.Icmp6.OutGroupMembQueries = value + procSnmp6.Icmp6.OutGroupMembQueries = &value case "OutGroupMembResponses": - procSnmp6.Icmp6.OutGroupMembResponses = value + procSnmp6.Icmp6.OutGroupMembResponses = &value case "OutGroupMembReductions": - procSnmp6.Icmp6.OutGroupMembReductions = value + procSnmp6.Icmp6.OutGroupMembReductions = &value case "OutRouterSolicits": - procSnmp6.Icmp6.OutRouterSolicits = value + procSnmp6.Icmp6.OutRouterSolicits = &value case "OutRouterAdvertisements": - procSnmp6.Icmp6.OutRouterAdvertisements = value + procSnmp6.Icmp6.OutRouterAdvertisements = &value case "OutNeighborSolicits": - procSnmp6.Icmp6.OutNeighborSolicits = value + procSnmp6.Icmp6.OutNeighborSolicits = &value case "OutNeighborAdvertisements": - procSnmp6.Icmp6.OutNeighborAdvertisements = value + procSnmp6.Icmp6.OutNeighborAdvertisements = &value case "OutRedirects": - procSnmp6.Icmp6.OutRedirects = value + procSnmp6.Icmp6.OutRedirects = &value case "OutMLDv2Reports": - procSnmp6.Icmp6.OutMLDv2Reports = value + procSnmp6.Icmp6.OutMLDv2Reports = &value case "InType1": - procSnmp6.Icmp6.InType1 = value + procSnmp6.Icmp6.InType1 = &value case "InType134": - procSnmp6.Icmp6.InType134 = value + procSnmp6.Icmp6.InType134 = &value case "InType135": - procSnmp6.Icmp6.InType135 = value + procSnmp6.Icmp6.InType135 = &value case "InType136": - procSnmp6.Icmp6.InType136 = value + procSnmp6.Icmp6.InType136 = &value case "InType143": - procSnmp6.Icmp6.InType143 = value + procSnmp6.Icmp6.InType143 = &value case "OutType133": - procSnmp6.Icmp6.OutType133 = value + procSnmp6.Icmp6.OutType133 = &value case "OutType135": - procSnmp6.Icmp6.OutType135 = value + procSnmp6.Icmp6.OutType135 = &value case "OutType136": - procSnmp6.Icmp6.OutType136 = value + procSnmp6.Icmp6.OutType136 = &value case "OutType143": - procSnmp6.Icmp6.OutType143 = value + procSnmp6.Icmp6.OutType143 = &value } case "Udp6": switch key { case "InDatagrams": - procSnmp6.Udp6.InDatagrams = value + procSnmp6.Udp6.InDatagrams = &value case "NoPorts": - procSnmp6.Udp6.NoPorts = value + procSnmp6.Udp6.NoPorts = &value case "InErrors": - procSnmp6.Udp6.InErrors = value + procSnmp6.Udp6.InErrors = &value case "OutDatagrams": - procSnmp6.Udp6.OutDatagrams = value + procSnmp6.Udp6.OutDatagrams = &value case "RcvbufErrors": - procSnmp6.Udp6.RcvbufErrors = value + procSnmp6.Udp6.RcvbufErrors = &value case "SndbufErrors": - procSnmp6.Udp6.SndbufErrors = value + procSnmp6.Udp6.SndbufErrors = &value case "InCsumErrors": - procSnmp6.Udp6.InCsumErrors = value + procSnmp6.Udp6.InCsumErrors = &value case "IgnoredMulti": - procSnmp6.Udp6.IgnoredMulti = value + procSnmp6.Udp6.IgnoredMulti = &value } case "UdpLite6": switch key { case "InDatagrams": - procSnmp6.UdpLite6.InDatagrams = value + procSnmp6.UdpLite6.InDatagrams = &value case "NoPorts": - procSnmp6.UdpLite6.NoPorts = value + procSnmp6.UdpLite6.NoPorts = &value case "InErrors": - procSnmp6.UdpLite6.InErrors = value + procSnmp6.UdpLite6.InErrors = &value case "OutDatagrams": - procSnmp6.UdpLite6.OutDatagrams = value + procSnmp6.UdpLite6.OutDatagrams = &value case "RcvbufErrors": - procSnmp6.UdpLite6.RcvbufErrors = value + procSnmp6.UdpLite6.RcvbufErrors = &value case "SndbufErrors": - procSnmp6.UdpLite6.SndbufErrors = value + procSnmp6.UdpLite6.SndbufErrors = &value case "InCsumErrors": - procSnmp6.UdpLite6.InCsumErrors = value + procSnmp6.UdpLite6.InCsumErrors = &value } } } diff --git a/vendor/github.com/prometheus/procfs/proc_stat.go b/vendor/github.com/prometheus/procfs/proc_stat.go index 06c556ef9623..14b249f4fc66 100644 --- a/vendor/github.com/prometheus/procfs/proc_stat.go +++ b/vendor/github.com/prometheus/procfs/proc_stat.go @@ -18,7 +18,6 @@ import ( "fmt" "os" - "github.com/prometheus/procfs/internal/fs" "github.com/prometheus/procfs/internal/util" ) @@ -102,6 +101,8 @@ type ProcStat struct { RSS int // Soft limit in bytes on the rss of the process. RSSLimit uint64 + // CPU number last executed on. + Processor uint // Real-time scheduling priority, a number in the range 1 to 99 for processes // scheduled under a real-time policy, or 0, for non-real-time processes. RTPriority uint @@ -110,7 +111,7 @@ type ProcStat struct { // Aggregated block I/O delays, measured in clock ticks (centiseconds). DelayAcctBlkIOTicks uint64 - proc fs.FS + proc FS } // NewStat returns the current status information of the process. @@ -184,7 +185,7 @@ func (p Proc) Stat() (ProcStat, error) { &ignoreUint64, &ignoreUint64, &ignoreInt64, - &ignoreInt64, + &s.Processor, &s.RTPriority, &s.Policy, &s.DelayAcctBlkIOTicks, @@ -208,8 +209,7 @@ func (s ProcStat) ResidentMemory() int { // StartTime returns the unix timestamp of the process in seconds. func (s ProcStat) StartTime() (float64, error) { - fs := FS{proc: s.proc} - stat, err := fs.Stat() + stat, err := s.proc.Stat() if err != nil { return 0, err } diff --git a/vendor/github.com/prometheus/procfs/proc_status.go b/vendor/github.com/prometheus/procfs/proc_status.go index 594022ded48a..c055d075db00 100644 --- a/vendor/github.com/prometheus/procfs/proc_status.go +++ b/vendor/github.com/prometheus/procfs/proc_status.go @@ -15,6 +15,7 @@ package procfs import ( "bytes" + "sort" "strconv" "strings" @@ -76,6 +77,9 @@ type ProcStatus struct { UIDs [4]string // GIDs of the process (Real, effective, saved set, and filesystem GIDs) GIDs [4]string + + // CpusAllowedList: List of cpu cores processes are allowed to run on. + CpusAllowedList []uint64 } // NewStatus returns the current status information of the process. @@ -96,10 +100,10 @@ func (p Proc) NewStatus() (ProcStatus, error) { kv := strings.SplitN(line, ":", 2) // removes spaces - k := string(strings.TrimSpace(kv[0])) - v := string(strings.TrimSpace(kv[1])) + k := strings.TrimSpace(kv[0]) + v := strings.TrimSpace(kv[1]) // removes "kB" - v = string(bytes.Trim([]byte(v), " kB")) + v = strings.TrimSuffix(v, " kB") // value to int when possible // we can skip error check here, 'cause vKBytes is not used when value is a string @@ -161,10 +165,38 @@ func (s *ProcStatus) fillStatus(k string, vString string, vUint uint64, vUintByt s.VoluntaryCtxtSwitches = vUint case "nonvoluntary_ctxt_switches": s.NonVoluntaryCtxtSwitches = vUint + case "Cpus_allowed_list": + s.CpusAllowedList = calcCpusAllowedList(vString) } + } // TotalCtxtSwitches returns the total context switch. func (s ProcStatus) TotalCtxtSwitches() uint64 { return s.VoluntaryCtxtSwitches + s.NonVoluntaryCtxtSwitches } + +func calcCpusAllowedList(cpuString string) []uint64 { + s := strings.Split(cpuString, ",") + + var g []uint64 + + for _, cpu := range s { + // parse cpu ranges, example: 1-3=[1,2,3] + if l := strings.Split(strings.TrimSpace(cpu), "-"); len(l) > 1 { + startCPU, _ := strconv.ParseUint(l[0], 10, 64) + endCPU, _ := strconv.ParseUint(l[1], 10, 64) + + for i := startCPU; i <= endCPU; i++ { + g = append(g, i) + } + } else if len(l) == 1 { + cpu, _ := strconv.ParseUint(l[0], 10, 64) + g = append(g, cpu) + } + + } + + sort.Slice(g, func(i, j int) bool { return g[i] < g[j] }) + return g +} diff --git a/vendor/github.com/prometheus/procfs/stat.go b/vendor/github.com/prometheus/procfs/stat.go index 33f97caa08da..586af48af9f6 100644 --- a/vendor/github.com/prometheus/procfs/stat.go +++ b/vendor/github.com/prometheus/procfs/stat.go @@ -62,7 +62,7 @@ type Stat struct { // Summed up cpu statistics. CPUTotal CPUStat // Per-CPU statistics. - CPU []CPUStat + CPU map[int64]CPUStat // Number of times interrupts were handled, which contains numbered and unnumbered IRQs. IRQTotal uint64 // Number of times a numbered IRQ was triggered. @@ -170,10 +170,23 @@ func (fs FS) Stat() (Stat, error) { if err != nil { return Stat{}, err } + procStat, err := parseStat(bytes.NewReader(data), fileName) + if err != nil { + return Stat{}, err + } + return procStat, nil +} - stat := Stat{} +// parseStat parses the metrics from /proc/[pid]/stat. +func parseStat(r io.Reader, fileName string) (Stat, error) { + var ( + scanner = bufio.NewScanner(r) + stat = Stat{ + CPU: make(map[int64]CPUStat), + } + err error + ) - scanner := bufio.NewScanner(bytes.NewReader(data)) for scanner.Scan() { line := scanner.Text() parts := strings.Fields(scanner.Text()) @@ -228,9 +241,6 @@ func (fs FS) Stat() (Stat, error) { if cpuID == -1 { stat.CPUTotal = cpuStat } else { - for int64(len(stat.CPU)) <= cpuID { - stat.CPU = append(stat.CPU, CPUStat{}) - } stat.CPU[cpuID] = cpuStat } } diff --git a/vendor/github.com/prometheus/procfs/thread.go b/vendor/github.com/prometheus/procfs/thread.go new file mode 100644 index 000000000000..490c14708d43 --- /dev/null +++ b/vendor/github.com/prometheus/procfs/thread.go @@ -0,0 +1,80 @@ +// Copyright 2022 The Prometheus Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package procfs + +import ( + "fmt" + "os" + "strconv" + + fsi "github.com/prometheus/procfs/internal/fs" +) + +// Provide access to /proc/PID/task/TID files, for thread specific values. Since +// such files have the same structure as /proc/PID/ ones, the data structures +// and the parsers for the latter may be reused. + +// AllThreads returns a list of all currently available threads under /proc/PID. +func AllThreads(pid int) (Procs, error) { + fs, err := NewFS(DefaultMountPoint) + if err != nil { + return Procs{}, err + } + return fs.AllThreads(pid) +} + +// AllThreads returns a list of all currently available threads for PID. +func (fs FS) AllThreads(pid int) (Procs, error) { + taskPath := fs.proc.Path(strconv.Itoa(pid), "task") + d, err := os.Open(taskPath) + if err != nil { + return Procs{}, err + } + defer d.Close() + + names, err := d.Readdirnames(-1) + if err != nil { + return Procs{}, fmt.Errorf("could not read %q: %w", d.Name(), err) + } + + t := Procs{} + for _, n := range names { + tid, err := strconv.ParseInt(n, 10, 64) + if err != nil { + continue + } + + t = append(t, Proc{PID: int(tid), fs: FS{fsi.FS(taskPath), fs.real}}) + } + + return t, nil +} + +// Thread returns a process for a given PID, TID. +func (fs FS) Thread(pid, tid int) (Proc, error) { + taskPath := fs.proc.Path(strconv.Itoa(pid), "task") + if _, err := os.Stat(taskPath); err != nil { + return Proc{}, err + } + return Proc{PID: tid, fs: FS{fsi.FS(taskPath), fs.real}}, nil +} + +// Thread returns a process for a given TID of Proc. +func (proc Proc) Thread(tid int) (Proc, error) { + tfs := FS{fsi.FS(proc.path("task")), proc.fs.real} + if _, err := os.Stat(tfs.proc.Path(strconv.Itoa(tid))); err != nil { + return Proc{}, err + } + return Proc{PID: tid, fs: tfs}, nil +} diff --git a/vendor/github.com/prometheus/procfs/vm.go b/vendor/github.com/prometheus/procfs/vm.go index 20ceb77e2df7..cdedcae996d8 100644 --- a/vendor/github.com/prometheus/procfs/vm.go +++ b/vendor/github.com/prometheus/procfs/vm.go @@ -26,7 +26,9 @@ import ( ) // The VM interface is described at -// https://www.kernel.org/doc/Documentation/sysctl/vm.txt +// +// https://www.kernel.org/doc/Documentation/sysctl/vm.txt +// // Each setting is exposed as a single file. // Each file contains one line with a single numerical value, except lowmem_reserve_ratio which holds an array // and numa_zonelist_order (deprecated) which is a string. diff --git a/vendor/github.com/rs/dnscache/.travis.yml b/vendor/github.com/rs/dnscache/.travis.yml new file mode 100644 index 000000000000..ce47932b596c --- /dev/null +++ b/vendor/github.com/rs/dnscache/.travis.yml @@ -0,0 +1,13 @@ +language: go +go: + - "1.8" + - "1.9" + - "1.10" + - "1.11" + - "1.12" + - tip +matrix: + allow_failures: + - go: tip +script: + go test -v -race -cpu=1,2,4 -bench . -benchmem ./... diff --git a/vendor/github.com/rs/dnscache/LICENSE b/vendor/github.com/rs/dnscache/LICENSE new file mode 100644 index 000000000000..71abfee39c7e --- /dev/null +++ b/vendor/github.com/rs/dnscache/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2018 Olivier Poitrey + +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/rs/dnscache/README.md b/vendor/github.com/rs/dnscache/README.md new file mode 100644 index 000000000000..267c6996c535 --- /dev/null +++ b/vendor/github.com/rs/dnscache/README.md @@ -0,0 +1,78 @@ +# DNS Lookup Cache + +[![license](http://img.shields.io/badge/license-MIT-red.svg?style=flat)](https://raw.githubusercontent.com/rs/dnscache/master/LICENSE) +[![Go Report Card](https://goreportcard.com/badge/github.com/rs/dnscache)](https://goreportcard.com/report/github.com/rs/dnscache) +[![Build Status](https://travis-ci.org/rs/dnscache.svg?branch=master)](https://travis-ci.org/rs/dnscache) +[![Coverage](http://gocover.io/_badge/github.com/rs/dnscache)](http://gocover.io/github.com/rs/dnscache) +[![godoc](http://img.shields.io/badge/godoc-reference-blue.svg?style=flat)](https://godoc.org/github.com/rs/dnscache) + +The dnscache package provides a DNS cache layer to Go's `net.Resolver`. + +# Install + +Install using the "go get" command: + +``` +go get -u github.com/rs/dnscache +``` + +# Usage + +Create a new instance and use it in place of `net.Resolver`. New names will be cached. Call the `Refresh` method at regular interval to update cached entries and cleanup unused ones. + +```go +resolver := &dnscache.Resolver{} + +// First call will cache the result +addrs, err := resolver.LookupHost(context.Background(), "example.com") + +// Subsequent calls will use the cached result +addrs, err = resolver.LookupHost(context.Background(), "example.com") + +// Call to refresh will refresh names in cache. If you pass true, it will also +// remove cached names not looked up since the last call to Refresh. It is a good idea +// to call this method on a regular interval. +go func() { + t := time.NewTicker(5 * time.Minute) + defer t.Stop() + for range t.C { + resolver.Refresh(true) + } +}() +``` + +If you are using an `http.Transport`, you can use this cache by specifying a `DialContext` function: + +```go +r := &dnscache.Resolver{} +t := &http.Transport{ + DialContext: func(ctx context.Context, network string, addr string) (conn net.Conn, err error) { + host, port, err := net.SplitHostPort(addr) + if err != nil { + return nil, err + } + ips, err := r.LookupHost(ctx, host) + if err != nil { + return nil, err + } + for _, ip := range ips { + var dialer net.Dialer + conn, err = dialer.DialContext(ctx, network, net.JoinHostPort(ip, port)) + if err == nil { + break + } + } + return + }, +} +``` + +In addition to the `Refresh` method, you can `RefreshWithOptions`. This method adds an option to persist resource records +on failed lookups +```go +r := &Resolver{} +options := dnscache.ResolverRefreshOptions{} +options.ClearUnused = true +options.PersistOnFailure = false +resolver.RefreshWithOptions(options) +``` diff --git a/vendor/github.com/rs/dnscache/dnscache.go b/vendor/github.com/rs/dnscache/dnscache.go new file mode 100644 index 000000000000..1ae3dff6c6fc --- /dev/null +++ b/vendor/github.com/rs/dnscache/dnscache.go @@ -0,0 +1,275 @@ +package dnscache + +import ( + "context" + "net" + "net/http/httptrace" + "sync" + "time" + + "golang.org/x/sync/singleflight" +) + +type DNSResolver interface { + LookupHost(ctx context.Context, host string) (addrs []string, err error) + LookupAddr(ctx context.Context, addr string) (names []string, err error) +} + +type Resolver struct { + // Timeout defines the maximum allowed time allowed for a lookup. + Timeout time.Duration + + // Resolver is used to perform actual DNS lookup. If nil, + // net.DefaultResolver is used instead. + Resolver DNSResolver + + once sync.Once + mu sync.RWMutex + cache map[string]*cacheEntry + + // OnCacheMiss is executed if the host or address is not included in + // the cache and the default lookup is executed. + OnCacheMiss func() +} + +type ResolverRefreshOptions struct { + ClearUnused bool + PersistOnFailure bool +} + +type cacheEntry struct { + rrs []string + err error + used bool +} + +// LookupAddr performs a reverse lookup for the given address, returning a list +// of names mapping to that address. +func (r *Resolver) LookupAddr(ctx context.Context, addr string) (names []string, err error) { + r.once.Do(r.init) + return r.lookup(ctx, "r"+addr) +} + +// LookupHost looks up the given host using the local resolver. It returns a +// slice of that host's addresses. +func (r *Resolver) LookupHost(ctx context.Context, host string) (addrs []string, err error) { + r.once.Do(r.init) + return r.lookup(ctx, "h"+host) +} + +// refreshRecords refreshes cached entries which have been used at least once since +// the last Refresh. If clearUnused is true, entries which haven't be used since the +// last Refresh are removed from the cache. If persistOnFailure is true, stale +// entries will not be removed on failed lookups +func (r *Resolver) refreshRecords(clearUnused bool, persistOnFailure bool) { + r.once.Do(r.init) + r.mu.RLock() + update := make([]string, 0, len(r.cache)) + del := make([]string, 0, len(r.cache)) + for key, entry := range r.cache { + if entry.used { + update = append(update, key) + } else if clearUnused { + del = append(del, key) + } + } + r.mu.RUnlock() + + if len(del) > 0 { + r.mu.Lock() + for _, key := range del { + delete(r.cache, key) + } + r.mu.Unlock() + } + + for _, key := range update { + r.update(context.Background(), key, false, persistOnFailure) + } +} + +func (r *Resolver) Refresh(clearUnused bool) { + r.refreshRecords(clearUnused, false) +} + +func (r *Resolver) RefreshWithOptions(options ResolverRefreshOptions) { + r.refreshRecords(options.ClearUnused, options.PersistOnFailure) +} + +func (r *Resolver) init() { + r.cache = make(map[string]*cacheEntry) +} + +// lookupGroup merges lookup calls together for lookups for the same host. The +// lookupGroup key is is the LookupIPAddr.host argument. +var lookupGroup singleflight.Group + +func (r *Resolver) lookup(ctx context.Context, key string) (rrs []string, err error) { + var found bool + rrs, err, found = r.load(key) + if !found { + if r.OnCacheMiss != nil { + r.OnCacheMiss() + } + rrs, err = r.update(ctx, key, true, false) + } + return +} + +func (r *Resolver) update(ctx context.Context, key string, used bool, persistOnFailure bool) (rrs []string, err error) { + c := lookupGroup.DoChan(key, r.lookupFunc(ctx, key)) + select { + case <-ctx.Done(): + err = ctx.Err() + if err == context.DeadlineExceeded { + // If DNS request timed out for some reason, force future + // request to start the DNS lookup again rather than waiting + // for the current lookup to complete. + lookupGroup.Forget(key) + } + case res := <-c: + if res.Shared { + // We had concurrent lookups, check if the cache is already updated + // by a friend. + var found bool + rrs, err, found = r.load(key) + if found { + return + } + } + err = res.Err + if err == nil { + rrs, _ = res.Val.([]string) + } + + if err != nil && persistOnFailure { + var found bool + rrs, err, found = r.load(key) + if found { + return + } + } + + r.mu.Lock() + r.storeLocked(key, rrs, used, err) + r.mu.Unlock() + } + return +} + +// lookupFunc returns lookup function for key. The type of the key is stored as +// the first char and the lookup subject is the rest of the key. +func (r *Resolver) lookupFunc(ctx context.Context, key string) func() (interface{}, error) { + if len(key) == 0 { + panic("lookupFunc with empty key") + } + + var resolver DNSResolver = defaultResolver + if r.Resolver != nil { + resolver = r.Resolver + } + + switch key[0] { + case 'h': + return func() (interface{}, error) { + ctx, cancel := r.prepareCtx(ctx) + defer cancel() + + return resolver.LookupHost(ctx, key[1:]) + } + case 'r': + return func() (interface{}, error) { + ctx, cancel := r.prepareCtx(ctx) + defer cancel() + + return resolver.LookupAddr(ctx, key[1:]) + } + default: + panic("lookupFunc invalid key type: " + key) + } +} + +func (r *Resolver) prepareCtx(origContext context.Context) (ctx context.Context, cancel context.CancelFunc) { + ctx = context.Background() + if r.Timeout > 0 { + ctx, cancel = context.WithTimeout(ctx, r.Timeout) + } else { + cancel = func() {} + } + + // If a httptrace has been attached to the given context it will be copied over to the newly created context. We only need to copy pointers + // to DNSStart and DNSDone hooks + if trace := httptrace.ContextClientTrace(origContext); trace != nil { + derivedTrace := &httptrace.ClientTrace{ + DNSStart: trace.DNSStart, + DNSDone: trace.DNSDone, + } + + ctx = httptrace.WithClientTrace(ctx, derivedTrace) + } + + return +} + +func (r *Resolver) load(key string) (rrs []string, err error, found bool) { + r.mu.RLock() + var entry *cacheEntry + entry, found = r.cache[key] + if !found { + r.mu.RUnlock() + return + } + rrs = entry.rrs + err = entry.err + used := entry.used + r.mu.RUnlock() + if !used { + r.mu.Lock() + entry.used = true + r.mu.Unlock() + } + return rrs, err, true +} + +func (r *Resolver) storeLocked(key string, rrs []string, used bool, err error) { + if entry, found := r.cache[key]; found { + // Update existing entry in place + entry.rrs = rrs + entry.err = err + entry.used = used + return + } + r.cache[key] = &cacheEntry{ + rrs: rrs, + err: err, + used: used, + } +} + +var defaultResolver = &defaultResolverWithTrace{} + +// defaultResolverWithTrace calls `LookupIP` instead of `LookupHost` on `net.DefaultResolver` in order to cause invocation of the `DNSStart` +// and `DNSDone` hooks. By implementing `DNSResolver`, backward compatibility can be ensured. +type defaultResolverWithTrace struct{} + +func (d *defaultResolverWithTrace) LookupHost(ctx context.Context, host string) (addrs []string, err error) { + // `net.Resolver#LookupHost` does not cause invocation of `net.Resolver#lookupIPAddr`, therefore the `DNSStart` and `DNSDone` tracing hooks + // built into the stdlib are never called. `LookupIP`, despite it's name, can also be used to lookup a hostname but does cause these hooks to be + // triggered. The format of the reponse is different, therefore it needs this thin wrapper converting it. + rawIPs, err := net.DefaultResolver.LookupIP(ctx, "ip", host) + if err != nil { + return nil, err + } + + cookedIPs := make([]string, len(rawIPs)) + + for i, v := range rawIPs { + cookedIPs[i] = v.String() + } + + return cookedIPs, nil +} + +func (d *defaultResolverWithTrace) LookupAddr(ctx context.Context, addr string) (names []string, err error) { + return net.DefaultResolver.LookupAddr(ctx, addr) +} diff --git a/vendor/github.com/tsenart/vegeta/v12/.deepsource.toml b/vendor/github.com/tsenart/vegeta/v12/.deepsource.toml deleted file mode 100644 index 4ab01bce8078..000000000000 --- a/vendor/github.com/tsenart/vegeta/v12/.deepsource.toml +++ /dev/null @@ -1,15 +0,0 @@ -version = 1 - -[[analyzers]] -name = "python" -enabled = true - - [analyzers.meta] - runtime_version = "3.x.x" - -[[analyzers]] -name = "go" -enabled = true - - [analyzers.meta] - import_paths = ["github.com/tsenart/vegeta"] diff --git a/vendor/github.com/tsenart/vegeta/v12/Dockerfile b/vendor/github.com/tsenart/vegeta/v12/Dockerfile new file mode 100644 index 000000000000..a774cfb61ad7 --- /dev/null +++ b/vendor/github.com/tsenart/vegeta/v12/Dockerfile @@ -0,0 +1,21 @@ +FROM golang:1.20-alpine3.18 AS BUILD + +RUN apk add make build-base git + +WORKDIR /vegeta + +# cache dependencies +ADD go.mod /vegeta +ADD go.sum /vegeta +RUN go mod download + +ADD . /vegeta + +RUN make generate +RUN make vegeta + +FROM alpine:3.18.0 + +COPY --from=BUILD /vegeta/vegeta /bin/vegeta + +ENTRYPOINT ["vegeta"] diff --git a/vendor/github.com/tsenart/vegeta/v12/LICENSE b/vendor/github.com/tsenart/vegeta/v12/LICENSE index 03ec4f5a824e..d396b44b381b 100644 --- a/vendor/github.com/tsenart/vegeta/v12/LICENSE +++ b/vendor/github.com/tsenart/vegeta/v12/LICENSE @@ -1,6 +1,6 @@ The MIT License (MIT) -Copyright (c) 2013-2020 Tomás Senart +Copyright (c) 2013-2023 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 diff --git a/vendor/github.com/tsenart/vegeta/v12/Makefile b/vendor/github.com/tsenart/vegeta/v12/Makefile index 889be22ca25c..42a70b32af11 100644 --- a/vendor/github.com/tsenart/vegeta/v12/Makefile +++ b/vendor/github.com/tsenart/vegeta/v12/Makefile @@ -2,25 +2,14 @@ COMMIT=$(shell git rev-parse HEAD) VERSION=$(shell git describe --tags --exact-match --always) DATE=$(shell date +'%FT%TZ%z') -vegeta: vendor generate +vegeta: 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 get -u github.com/mailru/easyjson/... +generate: GOARCH := $(shell go env GOHOSTARCH) +generate: GOOS := $(shell go env GOHOSTOS) +generate: + go install github.com/mailru/easyjson/...@latest + go get github.com/shurcooL/vfsgen + go install github.com/shurcooL/vfsgen/...@latest go generate ./... - -vendor: - go mod vendor - -clean-vendor: - rm -rf vendor - -dist: - goreleaser release --debug --skip-validate - -clean-dist: - rm -rf dist diff --git a/vendor/github.com/tsenart/vegeta/v12/README.md b/vendor/github.com/tsenart/vegeta/v12/README.md index e671d51a6525..4a9521476c6d 100644 --- a/vendor/github.com/tsenart/vegeta/v12/README.md +++ b/vendor/github.com/tsenart/vegeta/v12/README.md @@ -1,32 +1,60 @@ -# Vegeta [![Build Status](https://github.com/tsenart/vegeta/workflows/CI/badge.svg)](https://github.com/tsenart/vegeta/actions) [![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 [![Build Status](https://github.com/tsenart/vegeta/workflows/CI/badge.svg)](https://github.com/tsenart/vegeta/actions) [![Go Report Card](https://goreportcard.com/badge/github.com/tsenart/vegeta)](https://goreportcard.com/report/github.com/tsenart/vegeta) [![PkgGoDev](https://pkg.go.dev/badge/github.com/tsenart/vegeta/v12/lib)](https://pkg.go.dev/github.com/tsenart/vegeta/v12/lib) [![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. +HTTP services with a constant request rate. [It's over 9000!](https://en.wikipedia.org/wiki/It's_Over_9000) ![Vegeta](http://fc09.deviantart.net/fs49/i/2009/198/c/c/ssj2_vegeta_by_trunks24.jpg) +## Features + +- Usable as a command line tool and a Go library. +- CLI designed with UNIX composability in mind. +- [Avoids](https://github.com/tsenart/vegeta/pull/92/files#r20198929) nasty [Coordinated Omission](http://highscalability.com/blog/2015/10/5/your-load-generator-is-probably-lying-to-you-take-the-red-pi.html). +- Extensive reporting functionality. +- Simple to use for [distributed load testing](https://kubernetes.io/blog/2015/11/one-million-requests-per-second-dependable-and-dynamic-distributed-systems-at-scale/). +- Easy to install and run (static binary, package managers, etc). + ## Install ### Pre-compiled executables Get them [here](http://github.com/tsenart/vegeta/releases). -### Homebrew on Mac OS X +### macOS -You can install Vegeta using the [Homebrew](https://github.com/Homebrew/homebrew/) package manager on Mac OS X: +You can install Vegeta using the [Homebrew](https://github.com/Homebrew/homebrew/): ```shell $ brew update && brew install vegeta ``` -### Source +Or with [MacPorts](https://www.macports.org/): + +```shell +$ port install vegeta +``` -You need `go` installed and `GOBIN` in your `PATH`. Once that is done, run the -command: +### Arch Linux ```shell -$ go get -u github.com/tsenart/vegeta +$ pacman -S vegeta +``` + +### FreeBSD + +On FreeBSD you can install Vegeta with the built in package manager because there is a [Vegeta Package](https://www.freshports.org/benchmarks/vegeta) available. + +```shell +$ pkg install vegeta +``` + +### Source + +```shell +git clone https://github.com/tsenart/vegeta +cd vegeta +make vegeta +mv vegeta ~/bin # Or elsewhere, up to you. ``` ## Versioning @@ -36,7 +64,7 @@ Both the library and the CLI are versioned with [SemVer v2.0.0](https://semver.o 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). +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`. @@ -51,7 +79,7 @@ Usage: vegeta [global flags] [command flags] global flags: -cpus int - Number of CPUs to use (defaults to the number of CPUs you have) + Number of CPUs to use (default = number of cpus) -profile string Enable profiling of [cpu, heap] -version @@ -66,6 +94,8 @@ attack command: Send body with chunked transfer encoding -connections int Max open idle connections per target host (default 10000) + -dns-ttl value + Cache DNS lookups for the given duration [-1 = disabled, 0 = forever] (default 0s) -duration duration Duration of the test [0 = forever] -format string @@ -88,12 +118,16 @@ attack command: Read targets lazily -max-body value Maximum number of bytes to capture from response bodies. [-1 = no limit] (default -1) + -max-connections int + Max connections per target host -max-workers uint Maximum number of workers (default 18446744073709551615) -name string Attack name -output string Output file (default "stdout") + -prometheus-addr string + Prometheus exporter listen address [empty = disabled]. Example: 0.0.0.0:8880 -proxy-header value Proxy CONNECT header -rate value @@ -104,6 +138,8 @@ attack command: 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) + -session-tickets + Enable TLS session resumption using session tickets -targets string Targets file (default "stdin") -timeout duration @@ -142,6 +178,7 @@ examples: 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` @@ -178,6 +215,15 @@ Specifies whether to send request bodies with the chunked transfer encoding. Specifies the maximum number of idle open connections per target host. +#### `-dns-ttl` + +Specifies the duration to cache DNS lookups for. A zero value caches forever. +A negative value disables caching altogether. + +#### `-max-connections` + +Specifies the maximum number of connections per target host. + #### `-duration` Specifies the amount of time to issue request to the targets. @@ -257,7 +303,7 @@ Lines starting with `#` are ignored. ``` # get a dragon ball GET http://goku:9090/path/to/dragon?item=ball -# specify a test accout +# specify a test account X-Account-ID: 99 ``` @@ -302,7 +348,7 @@ The trade-off is one of added latency in each hit against the targets. 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: +Set to -1 for no limit. It knows how to interpret values like these: - `"10 MB"` -> `10MB` - `"10240 g"` -> `10TB` @@ -351,6 +397,10 @@ the ones configured by the operating system. Works only on non Windows systems. Specifies the trusted TLS root CAs certificate files as a comma separated list. If unspecified, the default system CAs certificates will be used. +#### `-session-tickets` + +Specifies whether to support TLS session resumption using session tickets. + #### `-targets` Specifies the file from which to read targets, defaulting to stdin. @@ -358,8 +408,7 @@ See the [`-format`](#-format) section to learn about the different target format #### `-timeout` -Specifies the timeout for each request. The default is 0 which disables -timeouts. +Specifies the timeout for each request. A value of `0` disables timeouts. #### `-workers` @@ -642,6 +691,9 @@ The CSV encoder doesn't write a header. The columns written by it are: 7. Base64 encoded response body 8. Attack name 9. Sequence number of request + 10. Method + 11. URL + 12. Base64 encoded response headers Arguments: A file with vegeta attack results encoded with one of @@ -734,6 +786,8 @@ It'll read and sort them by timestamp before generating reports. vegeta report *.bin ``` +Another way to gather results in distributed tests is to use the built-in Prometheus Exporter and configure a Prometheus Server to get test results from all Vegeta instances. See `attack` option "prometheus-addr" for more details and a complete example in the section "Prometheus Support". + ## 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 your terminal: @@ -753,7 +807,7 @@ echo 'GET http://localhost:8080' | \ ![](https://i.imgur.com/ttBDsQS.gif) -## Usage (Library) +## 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 @@ -810,6 +864,36 @@ $ ulimit -u # processes / threads Just pass a new number as the argument to change it. +## Prometheus support + +Vegeta has a built-in Prometheus Exporter that may be enabled during attacks so that you can point any Prometheus instance to Vegeta attack processes and monitor attack metrics. + +To enable the Prometheus Exporter on the command line, set the "prometheus-addr" flag. + +A Prometheus HTTP endpoint will be available only during the lifespan of an attack and will be closed right after the attack is finished. + +The following metrics are exposed: + +* `request_bytes_in` - bytes count received from targeted servers by "url", "method" and "status" +* `request_bytes_out` - bytes count sent to targeted server by "url", "method" and "status" +* `request_seconds` - histogram with request latency and counters by "url", "method" and "status" +* `request_fail_count` - count of failed requests by "url", "method", "status" and "message" + + + +Check file [lib/prom/grafana.json](lib/prom/grafana.json) with the source of this sample dashboard in Grafana. + +### Limitations + +1. Prometheus scrapes metrics from a running vegeta attack process and assigns timestamps to samples on its server. This means result timestamps aren't accurate (i.e. they're scraping time, not result time). +2. Configuring Prometheus to scrape vegeta needs to happen out-of-band. That's a hassle! +3. Since there's no coordination between a vegeta attack process and a Prometheus server, an attack process will finish before Prometheus has the chance to scrape the latest observations. + + +Why aren't we using pushgateway instead? See [this comment](https://github.com/tsenart/vegeta/pull/534#issuecomment-1629943731). + +There's [an issue](https://github.com/tsenart/vegeta/issues/637) tracking the proper solution to all these limitations which is a remote write integration. + ## License See [LICENSE](LICENSE). diff --git a/vendor/github.com/tsenart/vegeta/v12/attack.go b/vendor/github.com/tsenart/vegeta/v12/attack.go index 58ea54f84f5d..f83c2cba7454 100644 --- a/vendor/github.com/tsenart/vegeta/v12/attack.go +++ b/vendor/github.com/tsenart/vegeta/v12/attack.go @@ -7,16 +7,18 @@ import ( "flag" "fmt" "io" - "io/ioutil" "net" "net/http" "os" "os/signal" "strings" + "syscall" "time" + "github.com/prometheus/client_golang/prometheus" "github.com/tsenart/vegeta/v12/internal/resolver" vegeta "github.com/tsenart/vegeta/v12/lib" + prom "github.com/tsenart/vegeta/v12/lib/prom" ) func attackCmd() command { @@ -27,6 +29,7 @@ func attackCmd() command { laddr: localAddr{&vegeta.DefaultLocalAddr}, rate: vegeta.Rate{Freq: 50, Per: time.Second}, maxBody: vegeta.DefaultMaxBody, + promAddr: "0.0.0.0:8880", } fs.StringVar(&opts.name, "name", "", "Attack name") fs.StringVar(&opts.targetsf, "targets", "stdin", "Targets file") @@ -56,6 +59,9 @@ func attackCmd() command { 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") + fs.StringVar(&opts.promAddr, "prometheus-addr", "", "Prometheus exporter listen address [empty = disabled]. Example: 0.0.0.0:8880") + fs.Var(&dnsTTLFlag{&opts.dnsTTL}, "dns-ttl", "Cache DNS lookups for the given duration [-1 = disabled, 0 = forever]") + fs.BoolVar(&opts.sessionTickets, "session-tickets", false, "Enable TLS session resumption using session tickets") systemSpecificFlags(fs, opts) return command{fs, func(args []string) error { @@ -99,6 +105,9 @@ type attackOpts struct { keepalive bool resolvers csl unixSocket string + promAddr string + dnsTTL time.Duration + sessionTickets bool } // attack validates the attack arguments, sets up the @@ -116,6 +125,8 @@ func attack(opts *attackOpts) (err error) { net.DefaultResolver = res } + net.DefaultResolver.PreferGo = true + files := map[string]io.Reader{} for _, filename := range []string{opts.targetsf, opts.bodyf} { if filename == "" { @@ -131,7 +142,7 @@ func attack(opts *attackOpts) (err error) { var body []byte if bodyf, ok := files[opts.bodyf]; ok { - if body, err = ioutil.ReadAll(bodyf); err != nil { + if body, err = io.ReadAll(bodyf); err != nil { return fmt.Errorf("error reading %s: %s", opts.bodyf, err) } } @@ -172,6 +183,24 @@ func attack(opts *attackOpts) (err error) { return err } + var pm *prom.Metrics + if opts.promAddr != "" { + pm = prom.NewMetrics() + + r := prometheus.NewRegistry() + if err := pm.Register(r); err != nil { + return fmt.Errorf("error registering prometheus metrics: %s", err) + } + + srv := http.Server{ + Addr: opts.promAddr, + Handler: prom.NewHandler(r, time.Now().UTC()), + } + + defer srv.Close() + go srv.ListenAndServe() + } + atk := vegeta.NewAttacker( vegeta.Redirects(opts.redirects), vegeta.Timeout(opts.timeout), @@ -188,23 +217,42 @@ func attack(opts *attackOpts) (err error) { vegeta.UnixSocket(opts.unixSocket), vegeta.ProxyHeader(proxyHdr), vegeta.ChunkedBody(opts.chunked), + vegeta.DNSCaching(opts.dnsTTL), + vegeta.SessionTickets(opts.sessionTickets), ) 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) + signal.Notify(sig, os.Interrupt, syscall.SIGTERM) + return processAttack(atk, res, enc, sig, pm) +} + +func processAttack( + atk *vegeta.Attacker, + res <-chan *vegeta.Result, + enc vegeta.Encoder, + sig <-chan os.Signal, + pm *prom.Metrics, +) error { for { select { case <-sig: - atk.Stop() - return nil + if stopSent := atk.Stop(); !stopSent { + // Exit immediately on second signal. + return nil + } case r, ok := <-res: if !ok { return nil } - if err = enc.Encode(r); err != nil { + + if pm != nil { + pm.Observe(r) + } + + if err := enc.Encode(r); err != nil { return err } } @@ -218,7 +266,7 @@ func tlsConfig(insecure bool, certf, keyf string, rootCerts []string) (*tls.Conf filenames := append([]string{certf, keyf}, rootCerts...) for _, f := range filenames { if f != "" { - if files[f], err = ioutil.ReadFile(f); err != nil { + if files[f], err = os.ReadFile(f); err != nil { return nil, err } } diff --git a/vendor/github.com/tsenart/vegeta/v12/attack_nonwindows.go b/vendor/github.com/tsenart/vegeta/v12/attack_nonwindows.go index ad6d6a92a608..cd5689d90848 100644 --- a/vendor/github.com/tsenart/vegeta/v12/attack_nonwindows.go +++ b/vendor/github.com/tsenart/vegeta/v12/attack_nonwindows.go @@ -1,3 +1,4 @@ +//go:build !windows // +build !windows package main diff --git a/vendor/github.com/tsenart/vegeta/v12/encode.go b/vendor/github.com/tsenart/vegeta/v12/encode.go index 5f70a64777e0..b20438a96fb2 100644 --- a/vendor/github.com/tsenart/vegeta/v12/encode.go +++ b/vendor/github.com/tsenart/vegeta/v12/encode.go @@ -59,7 +59,7 @@ func encodeCmd() command { output := fs.String("output", "stdout", "Output file") fs.Usage = func() { - fmt.Fprintln(os.Stderr, encodeUsage) + fmt.Fprintf(os.Stderr, "%s\n", encodeUsage) } return command{fs, func(args []string) error { diff --git a/vendor/github.com/tsenart/vegeta/v12/flags.go b/vendor/github.com/tsenart/vegeta/v12/flags.go index 6a780d9df6f3..7ac8fcb1f2c8 100644 --- a/vendor/github.com/tsenart/vegeta/v12/flags.go +++ b/vendor/github.com/tsenart/vegeta/v12/flags.go @@ -132,3 +132,24 @@ func (f *maxBodyFlag) String() string { } return datasize.ByteSize(*(f.n)).String() } + +type dnsTTLFlag struct{ ttl *time.Duration } + +func (f *dnsTTLFlag) Set(v string) (err error) { + if v == "-1" { + *(f.ttl) = -1 + return nil + } + + *(f.ttl), err = time.ParseDuration(v) + return err +} + +func (f *dnsTTLFlag) String() string { + if f.ttl == nil { + return "" + } else if *(f.ttl) == -1 { + return "-1" + } + return f.ttl.String() +} diff --git a/vendor/github.com/tsenart/vegeta/v12/lib/attack.go b/vendor/github.com/tsenart/vegeta/v12/lib/attack.go index 0294c628b720..caebba6f831b 100644 --- a/vendor/github.com/tsenart/vegeta/v12/lib/attack.go +++ b/vendor/github.com/tsenart/vegeta/v12/lib/attack.go @@ -7,6 +7,7 @@ import ( "io" "io/ioutil" "math" + "math/rand" "net" "net/http" "net/url" @@ -14,6 +15,7 @@ import ( "sync" "time" + "github.com/rs/dnscache" "golang.org/x/net/http2" ) @@ -22,13 +24,11 @@ type Attacker struct { dialer *net.Dialer client http.Client stopch chan struct{} + stopOnce sync.Once workers uint64 maxWorkers uint64 maxBody int64 redirects int - seqmu sync.Mutex - seq uint64 - began time.Time chunked bool } @@ -60,7 +60,7 @@ 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} + DefaultTLSConfig = &tls.Config{InsecureSkipVerify: false} ) // NewAttacker returns a new Attacker with default options which are overridden @@ -68,10 +68,10 @@ var ( func NewAttacker(opts ...func(*Attacker)) *Attacker { a := &Attacker{ stopch: make(chan struct{}), + stopOnce: sync.Once{}, workers: DefaultWorkers, maxWorkers: DefaultMaxWorkers, maxBody: DefaultMaxBody, - began: time.Now(), } a.dialer = &net.Dialer{ @@ -83,7 +83,7 @@ func NewAttacker(opts ...func(*Attacker)) *Attacker { Timeout: DefaultTimeout, Transport: &http.Transport{ Proxy: http.ProxyFromEnvironment, - Dial: a.dialer.Dial, + DialContext: a.dialer.DialContext, TLSClientConfig: DefaultTLSConfig, MaxIdleConnsPerHost: DefaultConnections, MaxConnsPerHost: DefaultMaxConnections, @@ -175,7 +175,7 @@ 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 + tr.DialContext = a.dialer.DialContext } } @@ -187,7 +187,7 @@ func KeepAlive(keepalive bool) func(*Attacker) { tr.DisableKeepAlives = !keepalive if !keepalive { a.dialer.KeepAlive = 0 - tr.Dial = a.dialer.Dial + tr.DialContext = a.dialer.DialContext } } } @@ -208,6 +208,7 @@ func HTTP2(enabled bool) func(*Attacker) { if tr := a.client.Transport.(*http.Transport); enabled { http2.ConfigureTransport(tr) } else { + tr.ForceAttemptHTTP2 = false tr.TLSNextProto = map[string]func(string, *tls.Conn) http.RoundTripper{} } } @@ -220,8 +221,8 @@ func H2C(enabled bool) func(*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) + DialTLSContext: func(ctx context.Context, network, addr string, cfg *tls.Config) (net.Conn, error) { + return tr.DialContext(ctx, network, addr) }, } } @@ -245,6 +246,18 @@ func UnixSocket(socket string) func(*Attacker) { } } +// SessionTickets returns a functional option which configures usage of session +// tickets for TLS session resumption. +func SessionTickets(enabled bool) func(*Attacker) { + return func(a *Attacker) { + if enabled { + cf := a.client.Transport.(*http.Transport).TLSClientConfig + cf.SessionTicketsDisabled = false + cf.ClientSessionCache = tls.NewLRUClientSessionCache(0) + } + } +} + // 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 } @@ -260,6 +273,116 @@ func ProxyHeader(h http.Header) func(*Attacker) { } } +// DNSCaching returns a functional option that enables DNS caching for +// the given ttl. When ttl is zero cached entries will never expire. +// When ttl is non-zero, this will start a refresh go-routine that updates +// the cache every ttl interval. This go-routine will be stopped when the +// attack is stopped. +// When the ttl is negative, no caching will be performed. +func DNSCaching(ttl time.Duration) func(*Attacker) { + return func(a *Attacker) { + if ttl < 0 { + return + } + + if tr, ok := a.client.Transport.(*http.Transport); ok { + dial := tr.DialContext + if dial == nil { + dial = a.dialer.DialContext + } + + resolver := &dnscache.Resolver{} + + if ttl != 0 { + go func() { + refresh := time.NewTicker(ttl) + defer refresh.Stop() + for { + select { + case <-refresh.C: + resolver.Refresh(true) + case <-a.stopch: + return + } + } + }() + } + + rng := rand.New(rand.NewSource(time.Now().UnixNano())) + + tr.DialContext = func(ctx context.Context, network, addr string) (conn net.Conn, err error) { + host, port, err := net.SplitHostPort(addr) + if err != nil { + return nil, err + } + + ips, err := resolver.LookupHost(ctx, host) + if err != nil { + return nil, err + } + + if len(ips) == 0 { + return nil, &net.DNSError{Err: "no such host", Name: addr} + } + + // Pick a random IP from each IP family and dial each concurrently. + // The first that succeeds wins, the other gets canceled. + + rng.Shuffle(len(ips), func(i, j int) { ips[i], ips[j] = ips[j], ips[i] }) + + // In place filtering of ips to only include the first IPv4 and IPv6. + j := 0 + for i := 0; i < len(ips) && j < 2; i++ { + ip := net.ParseIP(ips[i]) + switch { + case len(ip.To4()) == net.IPv4len && j == 0: + fallthrough + case len(ip) == net.IPv6len && j == 1: + ips[j] = ips[i] + j++ + } + } + ips = ips[:j] + + type result struct { + conn net.Conn + err error + } + + ch := make(chan result, len(ips)) + ctx, cancel := context.WithCancel(ctx) + defer cancel() + + for _, ip := range ips { + go func(ip string) { + conn, err := dial(ctx, network, net.JoinHostPort(ip, port)) + if err == nil { + cancel() + } + ch <- result{conn, err} + }(ip) + } + + for i := 0; i < cap(ch); i++ { + if r := <-ch; conn == nil { + conn, err = r.conn, r.err + } + } + + return conn, err + } + } + } +} + +type attack struct { + name string + began time.Time + + seqmu sync.Mutex + seq uint64 +} + // 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 @@ -272,21 +395,29 @@ func (a *Attacker) Attack(tr Targeter, p Pacer, du time.Duration, name string) < workers = a.maxWorkers } + atk := &attack{ + name: name, + began: time.Now(), + } + 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 a.attack(tr, atk, &wg, ticks, results) } go func() { - defer close(results) - defer wg.Wait() - defer close(ticks) - - began, count := time.Now(), uint64(0) + defer func() { + close(ticks) + wg.Wait() + close(results) + a.Stop() + }() + + count := uint64(0) for { - elapsed := time.Since(began) + elapsed := time.Since(atk.began) if du > 0 && elapsed > du { return } @@ -309,7 +440,7 @@ func (a *Attacker) Attack(tr Targeter, p Pacer, du time.Duration, name string) < // all workers are blocked. start one more and try again workers++ wg.Add(1) - go a.attack(tr, name, &wg, ticks, results) + go a.attack(tr, atk, &wg, ticks, results) } } @@ -325,35 +456,49 @@ func (a *Attacker) Attack(tr Targeter, p Pacer, du time.Duration, name string) < return results } -// Stop stops the current attack. -func (a *Attacker) Stop() { +// Stop stops the current attack. The return value indicates whether this call +// has signalled the attack to stop (`true` for the first call) or whether it +// was a noop because it has been previously signalled to stop (`false` for any +// subsequent calls). +func (a *Attacker) Stop() bool { select { case <-a.stopch: - return + return false default: - close(a.stopch) + a.stopOnce.Do(func() { close(a.stopch) }) + return true } } -func (a *Attacker) attack(tr Targeter, name string, workers *sync.WaitGroup, ticks <-chan struct{}, results chan<- *Result) { +func (a *Attacker) attack(tr Targeter, atk *attack, workers *sync.WaitGroup, ticks <-chan struct{}, results chan<- *Result) { defer workers.Done() for range ticks { - results <- a.hit(tr, name) + results <- a.hit(tr, atk) } } -func (a *Attacker) hit(tr Targeter, name string) *Result { +func (a *Attacker) hit(tr Targeter, atk *attack) *Result { var ( - res = Result{Attack: name} + res = Result{Attack: atk.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() + // + // Subtleness ahead! We need to compute the result timestamp in + // the same critical section that protects the increment of the sequence + // number because we want the same total ordering of timestamps and sequence + // numbers. That is, we wouldn't want two results A and B where A.seq > B.seq + // but A.timestamp < B.timestamp. + // + // Additionally, we calculate the result timestamp based on the same beginning + // timestamp using the Add method, which will use monotonic time calculations. + // + atk.seqmu.Lock() + res.Timestamp = atk.began.Add(time.Since(atk.began)) + res.Seq = atk.seq + atk.seq++ + atk.seqmu.Unlock() defer func() { res.Latency = time.Since(res.Timestamp) @@ -375,8 +520,8 @@ func (a *Attacker) hit(tr Targeter, name string) *Result { return &res } - if name != "" { - req.Header.Set("X-Vegeta-Attack", name) + if atk.name != "" { + req.Header.Set("X-Vegeta-Attack", atk.name) } req.Header.Set("X-Vegeta-Seq", strconv.FormatUint(res.Seq, 10)) diff --git a/vendor/github.com/tsenart/vegeta/v12/lib/attack_fuzz.go b/vendor/github.com/tsenart/vegeta/v12/lib/attack_fuzz.go index e14eef61f076..eddb880737e7 100644 --- a/vendor/github.com/tsenart/vegeta/v12/lib/attack_fuzz.go +++ b/vendor/github.com/tsenart/vegeta/v12/lib/attack_fuzz.go @@ -1,3 +1,4 @@ +//go:build gofuzz // +build gofuzz package vegeta @@ -5,7 +6,6 @@ package vegeta import ( "encoding/binary" "fmt" - "io/ioutil" "net" "net/http" "os" @@ -20,7 +20,7 @@ func FuzzAttackerTCP(fuzz []byte) int { } // Start server - directory, err := ioutil.TempDir("/tmp", "fuzz") + directory, err := os.MkdirTemp("/tmp", "fuzz") if err != nil { panic(err.Error()) } @@ -77,7 +77,7 @@ func FuzzAttackerHTTP(fuzz []byte) int { } // Start server - directory, err := ioutil.TempDir("/tmp", "fuzz") + directory, err := os.MkdirTemp("/tmp", "fuzz") if err != nil { panic(err.Error()) } diff --git a/vendor/github.com/tsenart/vegeta/v12/lib/pacer.go b/vendor/github.com/tsenart/vegeta/v12/lib/pacer.go index 4c04d637fc68..751bef60a36e 100644 --- a/vendor/github.com/tsenart/vegeta/v12/lib/pacer.go +++ b/vendor/github.com/tsenart/vegeta/v12/lib/pacer.go @@ -41,7 +41,8 @@ type Rate = ConstantPacer var _ Pacer = ConstantPacer{} // String returns a pretty-printed description of the ConstantPacer's behaviour: -// ConstantPacer{Freq: 1, Per: time.Second} => Constant{1 hits/1s} +// +// 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) } @@ -99,37 +100,43 @@ const ( ) // SinePacer is a Pacer that describes attack request rates with the equation: -// R = MA sin(O+(2𝛑/P)t) +// +// 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 +// +// 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 --------------------->| +// 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) +// +// H = Mt - (AP/2𝛑)cos(O+(2𝛑/P)t) + (AP/2𝛑)cos(O) +// // Where: -// H = Total number of hits triggered during t +// +// 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 @@ -148,13 +155,14 @@ type SinePacer struct { 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𝛑} +// +// 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) } @@ -218,7 +226,8 @@ func (sp SinePacer) radians(t time.Duration) float64 { // hitsPerNs calculates the instantaneous rate of attack at // t nanoseconds after the attack began. -// R = MA sin(O+(2𝛑/P)t) +// +// 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)) } @@ -226,9 +235,12 @@ func (sp SinePacer) hitsPerNs(t time.Duration) float64 { // 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) +// +// 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)) +// +// 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 diff --git a/vendor/github.com/tsenart/vegeta/v12/lib/plot/assets.go b/vendor/github.com/tsenart/vegeta/v12/lib/plot/assets.go index efadc468c613..0498256a1700 100644 --- a/vendor/github.com/tsenart/vegeta/v12/lib/plot/assets.go +++ b/vendor/github.com/tsenart/vegeta/v12/lib/plot/assets.go @@ -1,3 +1,4 @@ +//go:build dev // +build dev package plot diff --git a/vendor/github.com/tsenart/vegeta/v12/lib/plot/assets_vfsdata.go b/vendor/github.com/tsenart/vegeta/v12/lib/plot/assets_vfsdata.go index b6818b230873..9c4afde8f0ff 100644 --- a/vendor/github.com/tsenart/vegeta/v12/lib/plot/assets_vfsdata.go +++ b/vendor/github.com/tsenart/vegeta/v12/lib/plot/assets_vfsdata.go @@ -1,6 +1,6 @@ // Code generated by vfsgen; DO NOT EDIT. -// +build !dev +//go:build !dev package plot @@ -9,7 +9,6 @@ import ( "compress/gzip" "fmt" "io" - "io/ioutil" "net/http" "os" pathpkg "path" @@ -21,40 +20,40 @@ var Assets = func() http.FileSystem { fs := vfsgen۰FS{ "/": &vfsgen۰DirInfo{ name: "/", - modTime: time.Date(2018, 8, 13, 15, 32, 56, 947383985, time.UTC), + modTime: time.Date(2022, 10, 16, 17, 51, 16, 603062578, time.UTC), }, "/VERSIONS": &vfsgen۰FileInfo{ name: "VERSIONS", - modTime: time.Date(2018, 8, 13, 15, 0, 41, 923198933, time.UTC), + modTime: time.Date(2022, 10, 16, 17, 51, 16, 601897135, 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), + modTime: time.Date(2022, 10, 16, 17, 51, 16, 601961468, 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"), + compressedContent: []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x02\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), + modTime: time.Date(2022, 10, 16, 17, 51, 16, 602455294, 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"), + compressedContent: []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x02\xff\xec\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\x99\xdd\xad\xdf\x56\xdd\x33\x55\x13\x8b\x40\xa3\xf1\xee\x6e\x34\x1a\xdd\xc7\x47\xed\xd6\xff\x89\xe9\x98\x24\x39\x69\x9d\xa5\x8b\x4d\x46\xa7\x33\xd6\xea\xf7\xbc\x1f\x5b\xe7\x38\x69\xfd\x82\x93\x88\x64\xdf\xf0\xbc\xe5\x44\x38\x59\x45\xdf\xfe\xcf\x74\x8e\x69\xec\x8e\xd3\x39\x68\x7d\xba\xbc\xed\xaa\xb2\x51\xcb\x99\x31\xb6\xf0\x8f\x8f\xd3\x05\x49\xf2\x74\x99\x8d\x89\x9b\x66\xd3\x63\x95\x9f\x1f\x7f\xba\xbc\x05\xad\xa3\xe3\xff\xd5\x9e\x2c\x93\x31\xa3\x69\xe2\x30\xf0\x48\x27\x8e\x95\xde\xff\x37\x19\x33\x0b\x21\xb6\x59\x90\x74\xd2\x22\xeb\x45\x9a\xb1\xdc\xb6\xad\x65\x12\x91\x09\x4d\x48\x64\xb5\x75\xe6\x3c\x8d\x96\x31\x01\xf2\x8f\xab\x40\x11\x73\x40\x40\xe2\x9c\xb4\x38\x3e\x8d\xbf\xc4\x28\xb1\xd8\xb6\xfc\xeb\xe2\x79\x04\xe4\x4f\x67\x18\x42\x26\x8b\x3e\xae\x70\xd6\x22\x01\x41\x4d\xb5\x3e\xd0\x24\x4a\x1f\x06\xf2\x8f\xdf\x04\x31\x8d\xd3\x7b\x1c\x0f\xe4\x9f\x46\x88\x9c\xc4\x93\x01\xff\xc7\x67\x33\x9a\x43\xe2\x9e\x6f\xa6\x19\x5e\xcc\x78\xe3\x77\x3b\xa7\x18\x15\xf0\x98\x11\xb6\xcc\x92\x96\x4e\x69\x31\x87\x40\x0c\x29\x78\x2c\x52\x12\x27\x85\xb9\x18\xbd\x36\x1e\xa6\xa1\xfc\x45\xc4\x2f\xde\x8d\x18\x35\x0c\x42\x46\xfe\xbe\xa4\x19\xb1\x6d\xf5\x23\xe0\x65\x72\xdb\x8e\x81\xaa\x2f\x76\x52\xd8\xee\x01\x9e\x9e\xe9\xb4\x4c\xa5\x71\xac\x33\x94\x90\x87\xd6\x45\x96\xa5\x99\x63\x9d\xe1\x24\x49\x59\x6b\x42\x93\x48\xcd\x49\xeb\x07\xab\x93\x76\xac\x1f\x2c\x10\xb0\x59\x96\x3e\xb4\x66\xee\x38\x8d\x08\xb2\x3e\x5d\x9f\x7f\xfd\x78\x31\xba\xba\xbe\x1d\xbd\xbb\xfe\x7a\x75\x6e\xc1\xd9\x8e\xe3\x5b\x22\xde\x76\xf4\xa8\x26\xd1\x7f\xdc\xed\x02\xde\x87\x61\x2f\x74\xc7\x38\x8e\x9d\xa5\x9e\x5f\x68\x2e\x19\x5e\x14\x23\x01\xe8\x85\x43\x16\x06\xaa\xa9\x89\x83\xb7\x5b\x06\x76\x70\x09\xcb\x82\x0c\xca\xa1\xdb\x29\x20\x5e\xa3\xce\xdc\x4d\xd2\xcc\xe1\xd8\xb2\xef\x19\x2e\x98\xa2\x5e\x90\x9e\x50\x37\x26\xc9\x94\xcd\x82\xb4\xd3\x01\x89\x43\xf9\x98\x17\x2d\xd8\x39\x8f\x9e\x3f\x2c\x1b\xcb\x2b\x37\x66\x8d\x3a\xe0\x51\x0e\x8d\x31\x90\x39\x61\xb7\x74\x4e\xd2\x25\x6b\xcd\x70\xde\xe2\x83\x7a\x4f\x48\xd2\xd2\xeb\x07\xec\x8c\x59\x6f\x28\x3f\x8e\x09\xce\xbe\x17\x43\xa6\xf6\x5c\x84\x10\x2a\x2b\xd6\x93\x5d\xa6\x38\x0c\xca\x85\x20\x20\xe9\x76\xdb\x8e\x80\x6d\xef\x97\x88\x0c\x2c\xb0\x5e\x9c\x65\x1b\xbd\x94\x23\x91\xb2\x1b\x63\x36\x9e\x39\x04\x3c\x9a\x59\x72\xae\x93\x65\x1c\xc3\x2a\x50\x15\x40\x6c\x1a\x01\xb0\x2b\xfb\x93\xaa\xfe\x8c\x11\x42\xe6\x40\xe8\xf6\x99\x69\x0e\x93\x3d\xe2\xb0\xc9\x76\xdb\x1e\x03\xdb\x6e\x2c\x53\xc1\x04\xeb\x28\x8c\xa6\x8f\x1d\xd6\xdc\xa7\xb1\xd9\xa7\xfd\x1e\x8d\xcd\x1e\x55\xfa\x93\x3b\xe0\x71\x64\xdb\x53\xdb\x76\x46\xa8\xed\xc1\xa9\x5a\x6d\x83\x09\x9a\xba\xe3\x34\x19\x63\xe6\x4c\x80\xbf\x42\x5d\x0f\x4e\x54\x9e\x6d\xc7\x0e\x30\xe6\x38\x76\x24\x39\x18\xc9\xad\xc2\x50\xe6\xe4\x20\x18\xa1\x76\x2f\xd0\x0b\x9e\x20\x5d\x38\x20\x01\x78\xe4\xc9\x53\x34\x81\x13\x34\x0c\x83\x4e\x67\x75\x42\x02\x30\xb5\xed\xe9\x70\x15\xba\xd9\x32\x71\x40\x20\x2a\x2c\x4b\xed\xa6\x48\xf4\x4d\xb4\x91\xcf\x81\xd1\x85\x19\x5f\xf6\x7c\x9d\xd2\xdc\x9d\x2c\x13\xc4\xa0\xf8\x89\xb3\x0c\x6f\x10\x29\xe1\x96\x0e\x78\x14\x64\x20\x82\x63\xb8\x40\x25\x2d\x7f\xdc\x05\x6d\x83\x18\xf2\x61\x8d\x9a\x36\x68\xb9\xdc\x06\xe5\x4f\x9f\xaa\xd1\x66\xe0\x31\x42\x74\xc7\x4b\x8f\x9b\x4a\x9b\xd3\x3a\x30\x3f\xfc\xa4\xc4\x30\x46\xc9\x6e\xe7\x48\xea\x37\x15\xc3\x23\xbb\xcc\x87\x23\x58\xb8\x09\x59\xb3\x5b\x3a\xfe\x86\xea\xe4\x89\x08\x4a\x79\xca\xbb\xec\xe0\x6c\xba\x9c\x93\x84\xe5\x6a\xec\xba\x9e\x58\x86\xf5\xe4\x37\x1e\xd0\xb3\x83\x91\x17\xe0\x93\x3a\x40\x80\x3b\x1d\x40\x86\xb8\xeb\x85\xa8\xc8\x1b\xe2\x30\x98\xb8\x8b\x65\x3e\x73\x78\x8d\x72\xec\x01\xf4\xda\xa8\x98\xab\xed\x76\xb4\xdd\x66\x4e\x0c\x76\x70\xe6\x2e\xb2\x94\xa5\x7c\x04\xf8\xbc\x22\x73\x94\xd5\x74\xb9\x78\xb1\x88\x37\x6a\xe5\x16\xf3\x06\x76\x70\xe1\x32\xca\x62\x82\xac\xfb\x2c\x7d\xc8\x49\x66\xc1\x85\xab\x7e\xa2\x76\x0f\x2e\x5c\x92\xac\xd0\x23\x87\xc3\xd9\x74\xc5\x47\x6a\xe1\xae\x48\x96\xd3\x34\x41\x96\x55\x7e\xe4\x12\x28\x4d\xd0\x92\xc3\x46\xd1\x47\x9a\x33\x92\x90\x4c\x7c\xa7\xc9\x98\xc8\x1f\x93\x89\xf8\x9b\x91\x79\xba\x22\x15\x18\x99\x74\x1a\xc7\x3a\x35\x17\xc9\x64\x4e\x99\xf8\xb1\xc8\xc8\x82\x24\x55\xbc\x2a\xed\x3a\x19\x57\x71\xc5\x05\x0a\x73\x0a\xe5\x36\x1d\x86\xbc\xa1\xf7\x34\x89\x68\x32\xad\xe4\xef\xd1\xe0\x45\x96\x8e\x49\x9e\x6b\xe0\x16\x95\x54\x38\x5f\x2e\xf8\x92\x16\x24\x18\x2e\xdc\xf1\x43\x84\xf6\xb8\xbc\x75\x6c\x89\xbc\x59\x44\xb3\xef\xab\x44\x80\x1e\xa8\x62\x39\xc7\xf9\xb7\xfd\x4a\x5a\xbd\xdd\x0e\x3e\xee\x42\xd8\xdf\xe7\x4e\xd6\x32\x27\xad\x9c\x65\x74\xcc\xac\xe0\x5a\x88\x62\xae\xe4\x1c\x9f\xb3\x74\x41\x32\xb6\x71\x30\xb4\x46\x23\x92\x7f\x12\x6c\xde\x82\x8f\x2b\x1c\x2f\x89\xdf\xee\xed\xe4\xce\xa0\x88\x39\x96\x7b\x7c\x8f\xb3\xdc\x02\x30\x69\x18\xca\x16\xb3\x6d\xe6\x96\x38\x06\xcc\x7f\x8c\xc8\x04\x2f\x63\xe6\xb3\xdd\xce\xa1\x00\x66\x66\xab\x77\x41\x56\x2e\x55\xb1\x97\x12\x57\xc1\x43\x23\xc7\x25\x6b\x96\xe1\x31\xbb\x21\x19\x25\xe6\x14\x2a\xbe\xab\xf6\x13\x85\x09\xcc\x60\xca\xd7\x64\x8e\xb0\x3b\x25\xcc\xb1\xe2\x74\x9a\x8f\x71\x4c\x2c\x00\x63\xd4\x0b\xe2\x13\xa6\xb7\x59\xdc\xe9\x00\x8a\xd8\x30\xe6\x72\x08\xcc\xe4\x2f\x12\xc2\xdc\xb6\xf9\xae\x68\x23\x94\xd9\xb6\x93\x0d\x7b\xe1\x09\xea\x6d\xb7\xd9\xd0\xd3\x3f\xfa\xfc\x07\xe0\x99\x82\x3a\x02\xa8\xe1\x07\x4e\x82\x38\x9c\x48\x90\xdc\x87\xe6\x57\xf8\xca\x49\xc0\x20\x95\xbb\x77\xc8\x1b\x39\x4c\x60\x12\x86\xc0\xaf\xa4\x65\xa2\x19\xc3\x7e\x18\x86\xa0\x92\xc5\xb7\xe8\x50\xfc\xcb\xff\x09\x4b\x31\x24\xdd\x55\x06\x29\x4b\xe3\x98\x26\xd3\xd3\x15\xc9\xf0\x94\xec\x8d\x12\x41\x9f\x30\x9b\xb9\x73\x9a\x38\x04\xea\x51\x50\x13\x2b\x07\x0e\xe6\x30\x86\x33\xb8\xe4\xdc\x81\x8f\x69\x82\x7a\x5c\x18\x82\x19\xea\xc1\x1c\xf5\x9a\x06\x90\x33\x20\x35\x88\x5e\x08\x67\xf2\x57\x3f\x84\xcb\x61\x1c\x8a\x0f\x3d\x14\x54\x0f\x05\x05\xdb\xad\x93\x74\xd0\x8c\x77\x37\xed\x20\x0a\x33\xfe\xe1\x85\x30\xef\x20\x0f\xc0\xb8\x4b\xde\xa0\x9e\x24\xaf\x11\x47\xd1\x25\x61\xa0\x90\x44\x43\x2f\xd4\x78\xf8\x6f\x81\xaa\x8b\xa2\x61\x5f\xcc\x61\xda\x15\x10\x30\x53\x49\x1c\x67\x17\x79\x60\x27\x5a\x93\x0f\x86\x7a\xb2\xbd\xa3\xf4\x38\x87\x43\xef\x28\x39\xce\xa1\x77\x94\x1d\xe7\x61\xe8\x17\xb9\x7b\x03\xae\x65\xca\xe5\x0e\x62\xbd\x3c\x51\x06\x4b\x4e\x56\xa4\xee\xe0\xa3\xde\x20\xfe\xab\x5d\x08\x5f\xfc\x3f\xbc\x0d\x61\xce\x37\x62\xac\x37\x62\x4e\xa7\x73\x6c\x01\x38\x6b\xd8\x99\x4b\xd4\x0b\x96\xe5\xc2\x5a\xaa\x9d\xb9\x94\xb3\x2a\x7f\x91\x10\xce\x8a\x9d\x99\xda\xb6\x93\xea\x9d\xc9\x7f\x74\xe3\xa3\x54\x6e\x50\xbe\x2f\xd3\xea\xbe\x4c\xf9\xbe\x4c\xf5\xd4\xd6\xf6\x65\x5e\xdb\x97\x72\x67\x3a\x19\x92\x18\x61\x35\xbf\x9b\xc1\xa4\x93\x41\x9e\xc3\xb7\x29\xf0\xf3\x43\xfb\xb4\xbe\x59\xf3\x7f\xd1\x66\x85\x11\x1c\x0b\x2e\x5c\x1b\x68\xb1\x83\x29\xea\x05\xb4\x1c\x58\xca\x77\x2c\x4f\xe7\xbb\x79\x29\x77\x34\x4c\x54\x55\x78\xed\xf4\x20\xed\x92\x8e\x07\x82\xe4\x84\x76\xbc\x20\xe1\x27\x1f\x39\x62\x0e\xa7\x8f\x49\x28\xf7\x9c\x1c\xbb\x8c\xef\xbe\xb8\xd3\xe1\xfb\x36\x83\xcb\x8e\x44\xb3\x48\x1f\x1c\x01\xd9\x17\x74\xa0\x0f\x40\x10\x0f\x9c\x99\xcc\xcc\xff\x9e\x31\x67\x09\x8e\x63\x18\xa1\xfc\x38\x86\xe3\x21\x0d\xd1\x90\x0d\xa9\x98\xe8\x08\x0e\xa3\xee\xe2\x68\x06\xa3\xce\xe2\x68\x26\x66\x21\x45\x1e\x42\x64\x20\x20\xbc\xd0\x17\xe3\x5a\x2d\x94\xc2\x61\x0a\xd3\x30\x2c\x0e\x7e\xe3\xdf\xbd\x49\x5f\xfe\x3f\xbd\x49\xf5\x2a\xe2\x6b\x68\x5c\xdf\xac\x8b\x86\xcd\x3a\x45\xbd\x60\x5a\xae\xa9\xa9\xda\xac\xd3\x82\x8d\x4e\xc5\x66\x5d\x3c\xc9\x46\x9b\xb9\x67\x8a\x04\x13\xcc\x2b\x4c\x34\xd5\x0b\x2e\x05\x83\xa8\xd8\x6d\x72\xde\x79\x07\xc4\x42\x89\x51\x3e\x48\x8f\x73\xbf\x07\x67\x28\x1f\x8c\x8f\xca\xe5\x16\x1f\x39\x5e\x37\x06\xc7\x39\xf0\x3d\xb8\x44\x5e\xaf\x77\x34\x83\x89\xf8\x1b\xc3\xa8\xba\xb9\x97\x30\xe9\x2c\x15\x4e\x00\xfc\xe8\xc9\xbd\x5d\xdf\xe0\xd1\x3f\x7d\x83\x3f\x4d\x3f\x1f\x68\x9c\xa7\xc9\x65\xc2\x48\xb6\xc2\xb1\xa4\xa2\x30\x42\xf2\xf0\x97\xa1\x5e\x90\x95\x93\x94\xf1\x8d\xbf\xec\x20\x36\xcc\xf4\xce\x8c\xca\xaf\x17\x9c\x65\x72\xae\x6b\xdb\xce\xb2\xcb\x93\xbb\xa4\x00\x33\xbf\x5f\x84\xb2\x85\x63\x59\xb4\xc7\xa9\x4e\x34\x58\x1e\x47\x7e\x8f\x1f\x75\x66\x80\x4e\x9c\x48\xb2\xee\x29\x5a\x9c\xf4\x06\x3d\x7f\x01\x27\x28\x82\x23\x14\x1b\x53\x32\xe5\x53\x32\x05\xc7\x93\x4e\x7c\x14\x1f\x3b\x2f\x8f\x26\x47\x13\x00\xe0\x0a\x79\x22\x21\x0a\x28\x72\xa6\x32\xaf\x7f\x14\x81\xee\x08\x1c\xaf\x60\x52\x49\xeb\x88\xb4\x7c\x98\x85\x68\x38\x86\x7c\x32\xa7\x70\xc8\xff\x50\xf1\x91\x84\xe1\x4e\xa8\x09\x35\x44\x0f\x0e\x7b\xb0\x17\x86\x52\x79\x98\xa2\x68\x60\x36\x68\xc1\x1b\xb4\x00\xc7\x11\x5f\x23\x26\xd2\x85\x44\xea\x2c\xba\x29\x80\xf2\x57\x27\x05\xa5\x44\x90\xff\x6e\x62\xf3\xea\x19\x62\x63\xe8\x90\xbe\x97\x52\xfc\x21\xfa\x94\x48\xfa\x14\x61\x86\x67\x38\x89\x62\x92\x59\x9c\xde\x50\x27\x01\x9c\xe3\x3a\x96\xeb\x1e\x47\x52\x6f\xd9\x8d\xf1\x26\x5d\x32\x0b\xc0\x1c\x51\x27\xe5\x82\xb4\x79\xf0\xd0\x3d\x2d\x75\x1d\x60\x17\xc4\x35\x52\x55\x40\xc1\xf8\xbb\x49\xd5\xae\x02\xfb\xcc\x7e\xaa\x02\xa7\xc9\xe7\x94\x26\x2c\x3f\xcb\x08\x66\x24\x1a\x55\xc0\x4b\x22\x88\x51\x2f\xc0\xe5\x2e\xe9\x74\xb0\x5c\xbc\x9c\x9e\xe1\x10\x26\x88\xf0\x73\x77\xe2\x6e\x46\x2c\x5d\xa0\x2b\x7c\x05\xf9\xef\xfb\x94\xb1\x74\xae\x3f\x57\x38\x1e\xcd\x69\xb2\xcc\x51\x39\x12\x0b\x9c\xe5\xe4\x5d\x9c\x62\xe6\x50\x29\x9b\x02\x0d\xba\x88\x9f\x84\xf4\x42\xb0\xab\x76\x65\x4a\xd8\xc5\x9a\x65\x64\x4e\xee\x7e\xe1\x53\xf8\x24\x49\x97\xda\x1a\x49\x58\xf9\x34\x16\xaa\x08\x2e\xbf\x07\xf9\x09\x4a\x83\x9c\xd3\xeb\x89\xa3\x88\xae\x10\xde\x73\x51\xaf\x6d\xb7\xb5\x84\xae\x95\xcb\x22\x4b\xca\xd6\xb3\xe2\xc3\x0b\x83\xf8\x0d\xb5\x6d\x27\x46\x14\xc0\xd9\x09\xff\x39\xe3\x3f\x1d\x45\xb0\xb3\xed\x76\xf6\x26\x93\x14\x7e\x56\x26\x27\xdb\x6d\x7c\x92\xf0\xe4\x04\xc5\x9a\x5d\x0f\x13\x98\x85\xf5\xb9\xfb\x48\x13\x72\xc1\xd7\x2b\x9f\xbb\x27\xbb\xdb\x0b\x92\x72\xfa\x12\xc5\x89\x92\x10\x52\x35\x65\xb9\xb9\x38\xc7\x77\x57\x69\x36\xc7\xf1\xc8\x21\x1c\xa0\x98\x38\x88\x81\x28\xa0\xe6\xf5\xb9\x32\x7c\x06\x21\x06\xe6\xce\x8f\x0f\xee\xfc\xbd\x4d\xe4\x7b\x2f\x60\x6d\xdf\xf9\xaf\x77\x21\x7c\xfd\xaf\x11\x42\x4c\xf9\x01\x26\x88\x06\x89\xfb\x2b\x97\xf9\xdc\x3b\xe4\xc1\xc4\xbd\xf8\xf5\xf6\xcb\xe9\x0d\xea\xc3\xe4\x77\xec\x4a\x13\x36\x17\x40\xb7\xa9\xdc\x6e\x87\xe7\x8a\xb3\xb2\x1a\x4f\xea\x74\x32\xb9\xce\x52\xc1\x4d\x60\x8e\x84\xbc\x1d\x23\xb5\x5e\xf2\x01\xff\xe1\x27\xe6\x1e\xc9\x39\xff\x7b\x5c\xfb\x7c\xef\x6d\xc4\xbf\xeb\x15\xae\xc1\xa4\x62\xbb\xf1\xa9\xf2\x63\x98\xe0\x39\xf1\x09\xa4\xd1\xda\xcf\x3a\x78\x17\x50\xc9\xd2\x67\x85\xb8\x28\x74\x5f\x75\x72\xe1\x30\x48\x01\xa4\xd5\xae\x3e\x43\x53\xaa\xc0\xcf\x52\xab\xe4\x77\x6d\xf1\x7a\x4b\x9e\xde\x21\x02\xba\x18\x90\x26\xd1\x53\x0d\x31\x1b\x5c\xe1\x2b\x9f\x99\x4b\x99\x1e\x58\xca\xbb\x10\xfe\xf8\xef\xcd\xba\x1c\xc1\xbb\x64\x96\xac\xc1\x02\x9c\x97\x51\x27\xe3\x9c\xab\x22\x49\xe7\x35\xf6\x94\x16\xec\x29\xff\xc7\x24\x69\xbe\xce\x97\x0d\x42\x33\x97\xcb\xa2\x72\xed\x47\x8a\x54\x45\x85\xd0\x1c\x09\xa1\x79\xf9\xaf\x10\x9a\x67\x55\xa1\xb9\x2e\x30\x6b\x59\x78\x66\xca\xc2\x85\x0c\x3c\xfb\x0e\x3d\xd4\x6c\x57\x19\xb6\x7f\x48\xf2\x55\x84\x42\x5c\xc2\x1d\x3a\xc1\x66\x5c\x74\xa5\x9a\x33\xa5\xe5\x97\x17\xf2\x03\xac\x14\x64\x33\x2e\xb8\x52\x25\xb8\x4a\xe5\x50\xf9\xed\x29\x41\x36\x47\xfa\x1c\x19\xa3\x74\x90\x1d\xa7\x7e\x2f\x48\xc4\xf9\x32\x17\xe2\x5e\x5c\x48\x7a\x89\xb9\x49\xf2\xc3\x92\x5e\x95\xb0\x43\x63\x31\xfa\x3f\xed\x42\xf8\xd3\xbf\xf0\xac\x59\xdd\x10\xff\x86\x47\x4e\x3e\xb7\x49\xc3\xe6\x68\x3a\xac\x94\x8c\x41\x2e\x6e\xf1\x8b\x84\x41\x62\xdb\xf9\x89\x98\xe0\x5c\xed\x04\x45\xd2\xc5\x92\x2d\xc8\x3a\xfd\x17\x68\x5b\xd0\x30\xe4\xa7\x1c\x0f\x21\xa2\xaf\x10\xd9\x93\x5a\x96\x54\xe9\x4d\xff\x21\x0d\x4b\xde\xe9\xc8\x25\x2e\xf3\x82\x98\x2f\x4f\xa1\xcb\x54\x0a\x90\xe3\x5c\xe8\x2e\x69\xa1\xbb\x2c\xd6\x6c\x5c\x1d\x84\x7f\x85\x24\xa9\x1b\x5f\x8a\x91\x15\x3d\xaf\x21\x12\x52\x2d\x12\xd2\x8a\x48\x48\xb5\x48\x48\x81\xa6\x27\x4a\x26\xfc\xae\x83\xd5\x9e\x1c\xf5\xa7\x7f\xe5\x06\x53\xa2\xdc\x92\xd1\x78\x5f\xab\x43\x27\x4e\x6d\x7b\x95\xab\x44\xde\x15\x3e\xee\x82\x42\xf2\x66\xe5\x2d\x60\x8b\x26\x2d\x06\x54\xc3\xca\xe9\x9a\xe1\xfc\xfa\x21\xd1\x4d\x54\xa7\x2b\x88\xf9\x68\xf1\x63\x89\x38\xa2\x14\x24\x98\x14\x83\xc5\x20\x51\x1b\xd9\x6c\xb3\xc5\x39\xe1\xef\x27\x08\x55\xce\xa9\x6d\x2c\x44\x57\xb9\xdc\xa4\x90\x8f\xf4\xdd\xaf\x94\x71\x11\x95\x5f\x24\x26\x73\x92\x30\x44\x2a\x9f\x67\x69\xc2\xc8\x9a\x21\x2c\x53\x67\x84\x4e\x67\x0c\x31\xf5\x63\x24\x53\x1f\x68\xc4\x66\x88\xc9\xbf\x23\xd8\x4e\x5c\x9a\x9f\xe1\x64\x85\xf3\x1b\x7d\x0f\xe6\x98\x48\x01\x10\xb7\x68\x96\x84\xd9\xbb\x33\x73\xad\x40\xdd\x71\x12\x8c\x28\xdf\x08\x9f\xe3\x94\x9d\x66\x04\xab\x3b\xdf\x0c\x55\xfa\xe3\x8e\x05\x9e\xd1\x98\xad\x47\x41\xe6\xde\x93\x29\x4d\x3e\x63\x36\x73\x00\xcc\xdc\x8c\x8c\x99\x53\xa0\x73\xd7\xb0\xfc\xbd\x31\x7e\x3f\x18\xbf\x67\xbc\xdc\x38\xa6\x0b\x47\xcc\x4b\xa5\xaa\x19\x8d\x22\x92\x88\xaa\xe0\x3f\xb7\xaa\x8a\x98\xe3\x8a\xab\xef\xbd\x9b\xe0\xea\xa4\x48\xa0\x2f\xbc\xd6\x1e\xec\x19\x53\x61\xce\x15\xa8\x71\x7b\x92\x44\x64\x1f\xf1\x68\xb9\x88\x30\x23\x52\x64\x76\x80\x44\x30\x92\xc0\x5c\x7a\x3d\x9b\xe1\x8c\x39\x02\xd7\x68\x4a\xd8\x25\x23\x19\x66\x69\xf6\x39\x23\x11\x1d\x63\x46\x1a\x17\xeb\x20\x77\x47\x0b\x0d\x71\x3b\xc3\xec\xe6\x1b\x5d\xe4\x17\xf3\x05\xdb\xc8\x8a\x84\x86\x58\xe0\x7c\x12\xac\x26\xba\x1b\x42\x71\x1b\x21\x36\x24\xa1\x38\xe9\x09\x3c\x51\x86\x1f\x6e\xd8\x26\x26\x11\x6f\xf5\xde\x5e\x10\xbc\x21\x96\xec\x8a\x2f\x58\x35\xad\x70\x89\x66\x7c\x99\xbd\x4d\xd3\x98\xe0\xe4\x7a\x21\xca\x58\x39\x23\x0b\xbe\xf2\x2c\xc8\xdc\x9c\xb0\x2b\x3c\x27\x20\xe0\x6b\x5b\x58\x10\x7c\xa4\xdf\x88\x24\x9b\x54\xb2\xb6\x40\xde\x81\x35\x61\xe2\xcd\x7a\x8f\x17\x17\xd1\x54\x0d\xb1\x89\x12\x8e\x11\x73\x17\x22\x19\x2e\x50\x91\x0e\xa7\x28\x71\xc7\xe2\xf4\xa2\x87\xdb\x19\xc3\x1e\x1c\x2b\xda\x7e\x68\x2a\x9c\xa6\x06\x8c\xd3\x24\x21\x9c\xe5\x2f\x70\xc6\x0f\x21\xba\x15\x0b\x00\x00\x9c\x20\x6a\xdb\xda\x80\xea\x0d\xea\xc3\x11\x1f\x9a\x0c\x3f\xd0\x64\xaa\x96\x5a\x30\x72\x73\xbc\x22\x0e\x80\x13\xdb\x1e\xf1\x26\xf2\xf1\x3d\xc7\xf9\xac\xf6\xe9\x50\x39\x0e\x2b\xa4\x67\x43\x48\x19\x0e\x83\x53\x88\x61\x0c\x33\x18\xc1\x25\x24\x20\x50\xd9\xb2\x21\xd7\xe2\x88\xe4\x30\xb8\x82\x29\x24\x30\x7e\xbe\x9a\x61\x08\xe0\xc8\xcd\x48\xce\xd2\x8c\xa8\x85\x59\x56\xb7\x3f\xf1\x4a\x2c\x50\xaa\x12\x71\x6d\x2a\x78\x65\x24\xff\x8c\xe5\x9f\x05\x97\x79\xa6\xa8\xdd\x83\x93\xfd\x21\x98\x54\xb6\xfb\xc4\xcd\x59\x96\x7e\x23\x62\xb5\xa1\x1c\x4e\xdc\x98\x26\xe4\x2f\x82\x12\xe2\xc2\xa2\x67\x84\x88\x34\xd5\x18\xc1\x15\x22\x2e\x49\xa2\x11\xdc\x20\xe2\x16\xeb\x7d\x04\xd7\x88\xb8\x39\xc3\x19\x1b\x05\xeb\x93\x55\xb0\x56\xd7\xb4\x33\x34\x1a\xae\x43\xb8\x91\x6c\x9e\x67\xd9\x76\x7b\xe3\x8c\xe0\x1a\x04\x60\xdd\xe9\x70\xde\xb4\x46\x68\x05\xee\x33\x82\xbf\x05\x12\x7c\xa7\x18\x16\x42\x68\xa6\xa8\xe2\x66\xbb\x2d\x7e\xb6\xcb\x54\x90\x16\x67\x97\xa5\x6d\x3b\x13\x77\x9e\xae\xc8\x6d\xea\x2c\x61\x04\x54\x5f\x6e\x53\x47\x83\xaf\x61\x04\x00\x5c\x22\x39\x5a\xd2\x2e\x93\x4e\x9c\x18\xb5\x3d\x98\x6d\xb7\xaa\xca\x25\x78\x24\xc2\xf8\xe6\x32\x5a\x8f\xd0\x1a\xca\x0f\x87\x2f\x70\xc1\x1f\xaf\xc8\x9a\x0d\x88\xbb\x20\xe4\x9b\x6e\x86\xa0\x00\x62\xc1\xcc\xb5\x22\x61\xbc\xdd\x8e\xdb\x68\x1c\x14\x9a\x85\xa5\x6d\xcf\x21\x3f\x60\xb5\xa7\xb2\xcd\x3c\x6d\xbb\x2d\x50\xda\xf6\x1c\x08\xfd\x56\xbb\x07\x76\xba\x4f\x03\x6c\xdb\x4e\xfa\xbd\x3d\x6b\x48\x2e\x47\x0a\xf8\x05\x8e\xa6\x6c\xe8\x24\xdb\x6d\x0c\x6c\x7b\xa1\x24\xdb\x06\x20\x38\x73\x69\xb4\x0e\x81\x20\x34\x45\xc5\xe5\x6c\xec\xa6\xa8\xed\x69\x39\x50\xaf\x2c\x07\xc0\x45\xb1\xae\xcd\x7d\xd2\xb0\xba\x4b\x61\x30\xdb\x5b\xb8\xca\x42\x92\x98\x16\x92\x8f\xf2\x38\x45\x86\x69\x18\x64\x7a\x6b\x63\x25\xb5\x14\x64\xd1\xfc\xa5\xa9\x52\x06\x73\x21\xe2\x8b\xd3\x1b\x4c\x60\x3e\xec\x87\x92\xf9\xe9\xad\x58\x65\x38\x15\xce\x62\xf2\x1d\xdd\x60\x86\x0c\x61\x44\xd3\x41\x52\x88\xb0\x01\xe9\x76\x03\xc3\x06\x8b\xd3\x7b\x48\x11\x2e\xc4\x77\x9e\xfd\x28\x15\x0d\x78\x48\xc3\x20\xd1\x03\x8c\x0c\x96\x7b\x94\xb8\xeb\x8e\xc9\x9a\x35\xd4\xc6\x80\x9a\x1d\x25\xee\xc6\x80\xda\xd4\xbb\x52\xe3\x87\x35\xbe\x24\xda\xc7\x79\x0c\x22\xdb\x6d\x03\xbb\xe6\x72\xf9\x7e\x4f\xf3\x4a\xa2\x1a\xe5\x5c\x0a\x40\xe3\x34\x4e\xb3\xbc\x2e\xec\x88\xc4\x4f\x78\x31\x0a\x94\xda\xb7\x92\x3d\x25\x4c\x13\xfd\x45\x9c\x32\x26\x4e\x97\x33\x14\xd7\x18\xd7\x8c\x33\xae\x19\x1a\xce\xd4\xd1\x7a\xc9\xc5\x5d\x3e\xca\x52\xc9\x5e\xb1\x6e\x7b\xa4\x48\x58\xb4\x29\x1b\x8f\xe7\xaa\x83\x14\x04\x51\x1b\xc5\xb6\xed\x2c\xf9\xe9\x27\x02\xbb\x12\xf1\xcc\x44\xac\x67\x75\x8c\x66\x43\x2c\xee\xc4\x39\xdd\x2a\x8e\x2e\xf2\xea\x32\xad\x5c\x5d\x4e\x1c\xde\x98\x69\x08\xdb\x6c\xbb\xa5\x08\x29\xcb\xbe\x09\x4a\x79\xe2\x08\x8d\x39\x5d\xa4\x5c\x46\x5f\x4a\x73\xcb\x05\x18\xa7\x09\xa3\xc9\x92\x04\x23\xc4\xdb\xb3\x93\xec\xc9\x18\xe0\x21\x0d\xe1\xe6\x70\xbf\xe4\x6e\x14\x94\x5d\xf4\xad\xd8\x2f\x59\x85\x05\xac\x60\x66\xb0\x80\x0d\x1c\x39\x8f\x72\x8a\xfd\x09\x54\xd3\xea\x53\x58\xdd\x9a\x7e\x06\x45\x13\xfc\x15\x34\x6a\xf1\x37\x50\xb5\xc3\xaf\x34\x0a\xe2\x35\xcd\xab\x49\x2e\x4f\x52\x87\x0e\x4a\xf2\x77\x69\xa6\xf8\x2d\x05\x70\xa1\x84\x66\xbf\x58\xd1\x50\xea\x7f\x2f\x93\x88\xac\xfd\xa9\xfa\x3a\x4b\x97\x09\xf3\xd3\x42\xaa\xa0\xc9\x34\x26\x12\x8b\x68\x33\x83\x38\x8e\xe5\xb7\x92\xda\xd2\xdd\xfe\x86\x1f\x7d\x96\xb3\x9f\xa3\x47\x3e\x08\xea\xcb\x37\xc5\xc2\xdc\x1d\x19\x59\x0e\x97\x4c\x27\x34\x8e\x0f\x80\x1a\x59\x02\x94\x64\x59\x9a\x1d\x80\x35\xf3\x84\xd5\x2b\xac\xd6\xd5\x60\x08\x5a\x92\x36\x6c\x88\x5c\x94\xff\x2e\x27\x82\x6f\x65\xbe\x12\xae\x96\x73\x92\xd1\x71\x75\x41\xbc\x4d\xb3\x88\x64\x6a\x59\x60\x7e\x60\x23\xe6\xaa\x29\x88\xf6\x19\x8e\xe3\x7b\x3c\xfe\xc6\x81\xb6\xdb\xc4\x3d\xa3\xd9\x38\x26\xb9\x7b\x7e\xf1\xee\xf4\xeb\xc7\x5b\x18\x57\xcb\x49\xe4\x9f\x31\x6f\x77\x22\x10\xcf\x24\x40\x83\x48\xa9\xa5\x38\xcc\x19\x4b\x53\x4b\xc5\x02\xbc\xa1\xbf\x11\x0e\x13\x64\xb6\x4d\x6d\x7b\x4f\x4a\xe6\xd4\x6b\xbf\x05\xb2\x7b\x67\x7c\x75\x8a\x0a\x68\xa7\x7f\x94\x09\xeb\x83\x14\x2e\x01\x6c\xc2\xc2\xe4\x7e\x82\xb4\x00\x13\x13\x61\xce\xce\xf7\xce\x04\xdf\xc5\x4d\xbd\x16\xb8\xde\x0a\x2b\x0d\x2e\x01\x34\x08\xba\xcb\x9c\xa5\x73\x09\xc1\xc5\x91\x7d\x08\xbe\xb0\xde\x8b\x43\xb6\x38\x9d\x8f\xd3\x24\x4f\x63\xe2\x3e\xe0\x2c\x11\xcf\x27\x7e\x60\xad\x65\x4e\x5a\x05\x58\x2b\x15\x05\x5b\x0f\x94\xcd\x5a\xa2\xfe\x96\x34\x13\x51\x0a\xa7\x46\x86\xab\x87\x22\x6e\x9c\x16\x8e\xfb\x34\x5e\xcc\xf0\x13\xf3\x5b\x1e\x3e\xc4\xec\x16\xfc\x22\xda\x3f\x15\x2c\x61\x0f\x2e\x9f\x3b\x15\x90\xdf\x71\x2a\xc0\xfc\x54\x30\x16\x57\xa6\xf2\x1e\x75\x8a\x86\x5d\x0f\x76\xbd\x10\x4e\x50\xe2\xb2\xf4\xcb\xfb\xb7\x23\x27\x05\x70\x84\xac\x6c\x7a\x8f\x1d\xab\x33\x71\xb3\x8e\x05\xf9\xdf\xa9\xfa\x7b\x2f\xfe\xc6\x1d\x0b\x58\x41\xe6\xf2\x2e\x4b\x3a\x59\x3b\x37\x17\xa2\xf2\xea\xa9\x9b\x8f\xed\x76\x95\xd2\xa8\xd5\x93\xbf\xa5\xca\x8a\x81\x5d\x10\x69\x21\x50\xc9\x00\x1b\x14\x29\xa1\x33\x68\xcf\x6c\x7b\xe5\x6c\xdc\x0d\xd8\x6e\x67\xc5\x6d\xe9\x02\xf0\xd4\x05\x18\x88\xee\xf9\x0e\x45\xc3\x4d\x71\x99\x08\x37\xf2\x22\x52\xd8\xae\x39\x0b\xc4\x0b\x43\xa5\x1f\x1b\xf6\x42\x2e\x65\xf2\xbf\xd5\x74\x4f\xa5\x7b\x3a\x9d\x43\x30\x57\x53\x5f\x77\x76\xc4\x53\x3a\x46\xca\x06\x0a\xe8\x1a\x8c\x57\x87\x11\xf8\xc7\x82\x4f\x0f\x9c\x4c\x8b\xa0\x63\x38\x15\x37\x66\x99\x16\x59\x37\x85\x40\xf9\x44\x86\x17\x02\xe0\x7f\x17\x12\x7a\x38\x83\x23\x29\x73\xc6\x12\xad\xd0\x5f\xa4\x39\x91\xb3\x09\xe0\x14\x51\x38\x46\x45\x31\xb0\x93\x73\xaf\xd9\xc4\x04\xe7\x4c\xaa\x7d\x3e\x67\xe9\x7a\xd3\x40\x0f\x86\x21\xc4\xf2\x34\x26\xcf\xd5\x30\x11\x36\xad\x35\xdd\x5d\xdb\xd1\xf2\xec\x09\xf2\x80\x69\x23\x40\x0a\x01\x22\xc0\x6f\x7a\x01\xee\x76\xb5\x95\x80\x30\x0f\xa0\x13\xa7\x8f\x90\xe8\xa5\x92\x1a\xa5\xf1\x7e\x90\xf0\x39\x41\xbc\x97\xb6\x9d\x0c\xfb\xe2\x77\x3f\xb4\x6d\xe2\xe6\x8b\x98\x8e\x89\x83\xa1\x07\x76\xbb\xaa\x31\x82\x51\x59\xa5\x16\x55\x85\x6d\xf7\x11\x4f\xe8\x78\xe1\xb0\x17\x0e\x2a\xa8\x7c\xdc\xe9\xec\x04\x99\x53\x07\xef\xbe\x6d\xb7\xd5\x28\x64\xa8\x17\x88\x92\xbd\x50\x60\xc9\x3a\x9d\x62\x9f\x48\x6b\x49\x28\xf5\xe9\x10\xa3\xcc\x68\x86\x14\xd7\xaa\xbd\xf5\x54\x6f\xcb\xa3\x61\x5a\x1c\xa3\x72\x90\x22\x0c\x73\x84\xcb\xa7\x76\xb1\xe8\x76\x10\x9f\x88\x97\x5c\xfd\x70\x90\x22\xec\xc7\x6f\x88\x34\x27\x10\x8a\x7c\x0c\x76\x3b\xa9\x41\xe1\x30\x9c\xf5\x0c\xf3\x30\x28\x3a\x97\xc1\x62\x54\x32\x00\xd3\x93\x7c\xe0\x10\x7d\x8f\x0b\xd5\xaf\x25\x00\x7e\xfa\xa6\xcc\x59\x16\x39\x33\x00\xfc\xe2\xe7\x6e\xb7\x33\x15\xa1\x18\x3c\x66\x0e\x06\xc6\x50\xf4\x60\x8e\xca\x83\xcd\x49\x5e\x1e\x6e\x62\x79\xb8\xf1\x10\x8a\xf9\xd0\x33\xbd\x6c\x63\x71\x6b\xcd\x0f\x2d\x7e\x5f\xe6\xd9\x36\xd3\xfb\xa2\xcc\xdc\x91\xe2\x19\x8f\xc3\xc7\xb2\x9c\x68\xa1\x36\x87\x49\xa7\xa8\x17\xf2\x35\xbb\xab\x6a\x5e\x13\x98\xe9\x33\x96\xb8\x4c\xc8\xd2\x65\x12\x39\x09\x08\xca\x59\xc0\xdb\x6d\xde\x46\x58\xb7\x16\x77\xe9\x1b\x0f\xce\x50\xde\xc5\x6f\xbc\x20\x75\xe2\xed\x76\x06\x20\x46\xf9\x4e\x8d\xc6\x50\x60\x0d\xc1\x4e\x29\x91\x1f\x65\x9b\xfd\xea\x21\x24\x77\xfa\x90\xff\xd8\x41\xd9\xdf\xbd\x6c\x4f\x65\x4b\x2e\xef\x1b\x07\xb2\xd4\x69\xf7\x00\x64\xc5\xe9\x53\x8a\x67\x4d\x10\x6a\x43\xc3\x82\x8c\x37\x01\x19\x34\x7e\x07\x0b\x12\xd1\x04\x69\xd0\x8f\x1d\x1c\x8d\x85\x3c\xba\xff\x56\x22\xd9\x29\x0a\x52\x0a\x86\x7b\x44\x81\xb9\x75\xf1\xd5\xb6\x05\xcf\x70\x0d\xc9\xb7\x24\x16\x55\xe1\x43\x70\xc8\x8f\xf8\x9e\xc4\xb9\x03\xdc\x5c\xac\x65\x0f\x54\xce\x9a\x6f\x50\x8f\x1f\x38\x01\x71\x57\x34\xa7\xf7\x34\xa6\x6c\xe3\x80\x21\x0d\xb7\x5b\xac\x97\x3f\x85\xf2\x25\x51\xe3\x51\xb7\x17\xb0\x93\x02\x1d\x93\x07\x9a\xe7\x84\x94\x21\x0b\x81\xba\x9b\x68\xf7\xd4\xe4\xb7\xbd\x9d\x03\x8a\xf3\x93\x90\xcb\x0c\x7e\x22\xe4\x85\x9a\xd4\x0e\x23\x54\xc8\x08\xe3\x03\x12\x07\x1e\x7f\x23\xd1\x7b\x75\x01\xb1\x90\x40\x42\x02\xcc\x1d\x4e\xd8\x1f\x77\x70\x72\xe0\x7a\x41\xef\x2e\xc2\xa5\x95\x71\xd1\xb0\x04\xd1\x92\x40\x26\x7c\xf4\x12\x4d\x8e\x33\x44\x87\x49\x18\x14\x25\xd5\x7b\x0a\x69\x51\x35\x42\x51\xd7\x0b\x46\xbc\xc0\x48\x17\x58\xed\xcb\x59\x1b\x84\x87\xa3\x30\x78\x7e\x0c\x37\xca\x46\x6a\xfd\x9c\x38\xb6\x01\x70\xfe\x8c\x38\xb6\x01\xf0\x1e\x2d\x86\xa3\x10\x3e\x20\x72\xf0\xfc\xb5\x01\xf0\x14\x79\x9d\x07\x77\x4e\x93\xcd\x0a\xc7\x47\x0f\xee\x46\x5c\xa0\x06\xa7\x27\xbd\xc1\x29\xea\xf9\xa7\x6f\x3c\xdb\x76\x4e\x91\xc7\x21\x67\xee\xec\xe8\xb4\x33\x73\x37\x42\xa8\xbc\x86\xe7\x68\xc9\x6b\xb8\xd8\x17\xf6\xce\x61\x0f\x9e\xff\x33\x85\xbd\x0d\x17\xf6\x3e\x0a\x31\xef\xb6\x10\xf3\x6e\x4a\x31\xef\x1e\xc0\xcf\x85\x98\x77\xa3\xc4\xbc\x1b\x25\xe6\xdd\x28\x31\x6f\x2d\xc4\xbc\x95\x21\xe6\x7d\x86\xab\x8a\x98\xc7\xfb\x75\x06\x3f\xa1\x76\x2f\x70\xce\x0b\x96\x77\x44\xd4\xa5\xd1\x76\x5b\x18\x75\xb8\xef\xae\xbf\x9c\x5d\x8c\xde\x9d\xde\xdc\x8e\x3e\x7f\xb9\xfe\xf5\x8e\xcb\x57\x42\x9f\x5c\x13\x1e\x9c\x15\x28\x79\xc1\x15\x7c\x87\x86\x61\x70\x51\x0a\x84\x74\xe2\x5c\xa1\x0b\xad\x83\x4c\x5c\x9a\x5f\xff\xec\x5c\x09\x79\x70\x2e\x5f\xa7\x4a\xa2\xf1\xc9\xb6\xcf\x10\xba\x72\xd7\x2b\x1c\x97\xca\x82\x4f\xa8\xed\xc1\x33\x95\x0c\x33\x34\x1d\x5e\x69\x99\x46\x6a\x42\xbe\x05\xdf\x50\x21\x94\x66\x83\x53\x3f\x1e\xf0\x35\xec\x67\xf0\x1a\x15\xb0\x1b\xf8\x2d\x84\xf3\x41\xd7\x43\x08\xdd\x72\x3e\x64\xa2\x31\xc1\x4e\x43\xff\x50\x16\x2f\x57\xcb\x2d\x32\xa5\xd9\xec\x35\x92\xc2\x62\x91\x0c\x6c\x7b\x3e\x18\xce\xdc\x4d\x67\xe6\xce\x38\xee\x4a\x4d\x81\x84\xfe\x08\x06\xce\x4a\x73\xbe\x02\x39\xbc\x16\xfc\x6d\xa5\xf7\xa5\x99\xd1\x13\x52\xe4\x9c\x17\xdb\xcb\xbd\x15\x72\xe3\xe1\x62\x87\x72\xe0\xd8\xb6\x9d\x77\x8a\xc5\x7d\x84\xb7\x43\x2f\x0c\x01\x8c\x6d\x3b\x1b\xe8\xd4\xb2\x44\x26\x72\xfd\xfd\x8c\x6b\x91\x01\x00\xbc\x45\xd7\x7c\x31\xeb\x0c\x39\x3e\x13\x67\x05\x25\x6a\xf8\x0e\x88\x75\xa2\x16\xbc\x62\xc5\x57\xee\x66\xa4\xa8\x9f\x3e\x5c\x18\x49\x5c\x02\xaf\x8c\x3e\xdf\xac\x46\x3e\xdf\xb6\x20\x88\xd1\x1c\x5e\xdb\xf6\x95\x6d\x3b\xbc\xba\x6a\xd3\x74\xb5\x7c\x80\xb4\x34\xbc\xfb\x5e\x13\x15\x75\x25\xec\x7b\x3f\xc1\xbd\x5b\x6d\xdf\xfb\x71\x17\x42\xaf\xf7\xcf\xb7\xf5\x32\x5e\xb7\xff\x7b\xdd\x96\xff\x21\x93\x80\xea\xf5\x7a\x97\xd1\xf1\x37\x22\x9e\x7a\xa4\x28\x91\xd7\xe6\x95\x7c\x9a\x70\x92\x2a\xfa\xdf\x9d\xa7\x11\x89\xc5\x7b\x44\x2a\x0d\x1a\x2b\x90\x72\x96\x85\x39\x3f\xe5\xf2\x6d\xd4\x6c\x7b\x30\x46\x89\x13\x71\x9e\xfa\x38\xa3\xd3\x59\x4c\xa7\x33\x26\xf5\x40\x37\xf4\x37\xe2\xbf\x80\x45\xaa\x64\x1f\xd7\x0b\x75\x39\x5a\xcf\x78\x8b\xc7\xdf\xa6\x42\x98\x14\x0c\xcb\x77\x5f\x1d\x86\x10\x9c\xdb\xe7\x94\xdb\xe9\xbf\x7a\x05\x5b\xfa\x1f\x60\xc1\x58\x48\x39\x9a\x15\x7c\xa4\x09\xc9\xfd\xb6\xa7\x93\x67\xe9\xc3\x5f\x49\x96\x4a\xab\x13\xbf\xdd\x53\xe9\x3f\x7f\x7a\x5b\x02\xfd\xfc\xe9\x7d\x9f\x7f\xe5\xb3\xf4\x41\xca\x4c\xd7\xc9\x07\xdd\x12\x5e\x26\xa2\x53\xca\xf2\xd3\x09\x23\xd9\x39\x19\xd3\x39\x8e\xfd\x3e\x9c\xe3\xf5\xd5\x72\x7e\xaf\xd4\x66\xfe\x6b\x98\xd3\xe9\x3b\x3a\x55\x7d\x35\x55\xa0\x1e\xdc\xd3\xb2\xf9\x3d\xb8\xa7\x9a\xf2\xad\x87\x19\x65\xc4\x12\xaa\xd1\x5b\x3a\xfe\xa6\xc6\x93\x7f\x8a\x66\xbd\x4b\xa5\x02\xcc\xf7\x5e\x42\xe1\x42\xe5\x3d\x5e\xf8\xaf\x44\xb3\xbf\xa4\x71\x4c\x32\xde\x89\xb5\xe8\xea\x67\x9c\xe5\x24\xf3\x25\x4d\x87\x11\x89\xe9\x9c\x32\x92\xf9\x16\xb4\xa0\x78\xce\xe1\xf7\x61\xa1\x7f\xe2\xc5\x26\x6a\x89\x88\x8f\xea\xfb\x0e\x3e\x02\xa5\x2a\x4a\x00\x6b\x69\x44\x7f\xa8\x09\xf4\x5e\xc1\x66\xce\x2c\x46\xd7\x10\xc9\xea\xdf\x57\xf8\xea\x1d\x97\xcf\x2d\x1c\xc7\x16\x9c\xd1\x88\x5c\xaf\x48\x16\xe3\xcd\x75\xf2\x29\x5d\xe6\xe4\x7a\x29\xe6\x21\x26\x53\x92\x44\xbe\x95\x26\x73\x9e\x9a\xae\x48\x66\x41\x2d\xcd\x88\xce\x7f\xc1\xc9\x94\x7c\xc6\x91\xdf\x83\x9b\xe2\xb7\xbc\x1c\xcd\xf0\xc3\xe9\x9a\xe4\xa7\x8c\xaf\x07\x0e\x2c\x1e\x9b\x7f\x10\x86\x05\x7e\xff\x27\xb8\x16\x63\xac\xbe\xbd\x9f\xe0\x46\x7c\xab\x19\xfc\x49\xce\x02\x4d\x88\x9a\xaa\xfb\x58\xaa\x41\x55\xaa\x04\x73\x5f\xc0\x69\x46\xa3\x4a\x42\x31\x7b\x32\xe5\x55\xaf\x00\x31\xd6\xb4\xd7\xff\x09\xaa\xff\x81\x05\x8d\x1d\xfb\x89\x6f\x58\x3f\x2e\xc4\x09\xf5\x57\x24\x43\x9c\xd0\x39\x1f\xe3\xbf\xa6\xe9\x3c\xd7\x0b\x58\xf4\xfa\x86\xc4\x64\xcc\x52\xb1\x20\x32\x33\x41\x75\xef\x65\xaf\x9a\xcc\xc7\xef\x46\xac\x47\xd5\xa8\xff\xfd\x53\xef\xa7\x77\xa7\x6f\xad\x7d\xb0\x77\x72\xee\x23\x2a\x2e\x83\xcc\x65\xdb\x08\xaa\xf1\x9d\xfe\xf8\xd6\x3b\x7b\x59\x03\x2a\xf7\x77\xa5\xf2\x69\x86\x37\x07\x21\xcb\xc1\xf5\xf6\x6b\x34\x32\xdd\x57\xd5\xec\x77\x69\x46\x1a\xea\x52\xf3\x78\x00\xf4\x60\x65\x6a\xc1\xbf\x16\x43\x7e\x99\x54\x07\x5d\x5e\xbf\x2b\xf5\xfe\x70\x59\x4c\x9e\x79\xdc\x83\x46\xb2\xa9\x54\x36\xd3\x0d\xad\x7f\x08\x17\xf1\x72\x4a\x93\xdc\x1f\x86\x10\xaf\x49\xee\x3f\xae\xfd\xc7\x05\x5d\x93\x38\xff\x4c\x32\xb1\xc0\xfc\x1f\x7b\xf5\xd5\xf6\xba\x67\x52\x8f\x6c\x2e\x34\xf1\xfe\xd8\x8d\x30\x23\xa7\x7b\x19\x50\x30\x9a\x3a\xdc\x2f\x95\x44\xb1\x8f\xde\x67\x34\x12\x74\x51\xec\x29\x2a\xe8\x2a\x4d\x22\xe1\xff\x80\x24\xc2\x5f\x85\x48\x93\xac\xc9\x4f\x05\x9e\x5b\xf1\xb1\x83\x1b\xff\x71\x7f\x4f\xd4\x7a\xf2\xa2\xb7\xdf\x96\x44\x10\xdb\x5a\x6b\x1a\x7b\x27\x21\x1b\xfa\xf7\x87\xda\x9e\xc8\x03\x96\xc8\xd8\xc1\x4d\xff\xff\xdf\xe6\xeb\x26\x97\x5d\xf1\x1a\x9a\xef\x1d\x68\xfe\x6e\x17\x94\x72\xda\xe2\x59\x39\x4d\x4b\x04\xfe\x9f\xe0\x93\x02\x85\xef\xf5\x61\x83\x44\xe2\x7b\xaf\x0f\x4a\x79\xde\xbf\xde\x58\xf2\x9f\x62\x89\xcc\x94\x51\x19\x3f\x4b\x61\x9a\x90\x0c\xb1\x8a\x69\xb2\x38\xc6\xd7\x2e\xcf\xab\x05\x5c\x9a\x24\x24\xfb\x70\xfb\xe9\x23\xb2\x2c\x28\x39\x72\x1b\xa9\x2b\x5a\xcc\xc8\x48\x34\xd6\xb6\x6b\x09\x6e\x44\xb8\x84\xb0\xd1\x06\x6c\x65\x4e\xd5\x1a\xda\xa9\xd6\xa6\x34\x62\x59\xe5\xa1\x0c\x93\xa4\x89\xa6\x49\x83\x8e\xba\xed\x05\xac\xd4\x0f\x12\xc4\x86\xbd\xd0\xcd\xd2\x87\xbd\x7a\x2b\x88\x9c\x7a\x2d\xd3\xc6\x5a\xb4\x7f\xa0\x61\x08\x49\xbd\xcb\x95\x22\x8e\xd0\x33\x91\x93\x5e\xd5\xbe\x59\xd9\x49\xd4\x0a\x4a\x03\x83\x91\xbe\x46\x92\x46\xd0\xb8\x7c\xdd\x43\x01\x93\xa7\xaa\xc7\x2c\x7d\xf0\x09\x1c\xa7\xf1\x72\x9e\xf8\xb4\xe3\xed\x0a\x41\x9c\x7d\xaf\x99\x6f\x79\x64\xe1\xeb\xb6\xff\x3f\x46\xbe\xda\xc8\x57\xd8\xe8\xcf\xf1\xe6\x9e\xdc\x66\x04\x33\x29\xa8\x2d\x4e\xf3\xb3\xb8\xea\xaf\x48\x8e\x12\xe6\x3b\x65\x7a\x91\x44\xbf\xa2\x44\xfc\x7c\x4f\xd8\xaf\x23\x51\x23\x2c\xf2\xee\xca\xbc\x3b\x99\xa7\xc6\x47\x28\x9e\xf1\x7d\xee\x94\x68\xba\xf2\xe7\x0d\xc3\x19\xfb\x95\x1f\x7e\xf6\x61\xee\x4c\x98\x3b\x10\xd0\x93\xbe\x6d\xa7\xfc\x9f\x62\x1b\x12\x37\xc6\x39\x5b\x8f\x6c\xbb\xeb\xb5\x8d\xaf\xcc\x65\xfb\x9d\x72\x08\x54\xed\xcd\xc8\x94\xa6\x89\x34\x8f\xa0\xc5\xb7\x94\xae\x90\x70\x8e\x22\xcc\xe0\x3e\xe3\x64\x6f\x20\xd4\x4d\x6b\x80\x5d\x9a\x7f\xc6\x49\x42\x93\x29\x6a\xf7\x02\x79\x07\x40\xdc\x35\xa7\xf0\x42\x9e\x50\x5b\xa2\xbc\xce\x7e\x97\x0a\xae\x60\x3c\x60\x80\xd6\xda\x02\x03\x07\xbb\x34\xa1\x8c\xe2\xf8\x23\x99\xb0\x79\x9a\xb3\x73\xcc\x08\x4a\xdc\x38\x9d\x7a\x3d\xf5\x2a\x0d\x8b\x0d\x24\x10\x1b\x39\x5e\x08\xba\x15\x38\xe0\x1f\xc0\x26\x9c\x58\x98\x48\x78\xe1\xae\xc6\xbd\xfe\x9a\x50\xc6\x19\xe0\x67\xce\x09\x91\x01\x77\xec\x10\x57\xc9\x42\x23\x65\xc0\xd4\xf5\x00\x6c\xbc\xe1\xc7\xc9\x45\x34\x25\xef\x14\x73\xb1\x40\x61\xda\xa5\x14\x6b\x47\xdf\x55\x4a\x5c\x54\x8b\x61\x54\x6f\x0e\x72\x47\x5e\x4c\xb3\xf4\x3c\x9d\xff\x7a\x96\xa6\x59\xe4\xc4\xbc\xe1\xdd\x5c\xd8\x1a\x54\xd3\xbd\x10\x74\x72\x18\xc9\x74\xcc\xb0\xca\x98\x49\xd3\xbf\x4a\xda\x12\x04\xd8\xbd\xe7\x82\x22\x89\xf8\x20\xe5\x68\x18\xc1\xb1\x54\xa9\x29\xf3\x4b\xa2\xad\xcb\xbf\xaf\xed\xc6\xa3\x0e\xe2\x72\x39\x6f\x54\x7d\x7e\x84\x54\xea\x90\xca\x5a\x26\x28\x13\x4f\x60\xc8\x5c\x8e\x36\x1c\xe9\xfe\xdc\xc9\x26\x4e\xf8\xb4\x51\xd0\x99\x0a\x9b\xcd\x6a\x8e\xc7\x73\xba\x53\x61\xc4\x29\xfb\xa5\xb2\x46\x90\x02\x61\xcb\x59\x49\x5d\x41\x0a\x82\x85\x78\xa2\xb4\x81\xeb\x70\x57\x74\x5d\x3d\xe9\x58\x48\xd3\x28\x97\xe6\xfd\x73\xbe\xf0\xdb\x1e\xc4\xa2\xb5\x7c\x24\x7e\x47\x9f\xe6\xe8\x71\x07\xef\x11\x71\x37\xe5\x56\xa0\x20\x20\x2e\x66\x2c\xa3\xf7\x4b\xc6\x31\x4c\x09\x6b\xd8\x0e\x14\x0c\x9c\xb9\x5e\xbe\xb7\xe9\x42\xb4\xac\x58\xee\xf7\x42\x1b\x38\x17\x24\x41\xe4\x54\x77\xc3\x7d\x65\x37\xdc\x6b\x0d\xe1\x1e\x3a\x0e\xb7\x8f\x85\xa7\x76\x45\x21\x38\x77\x97\x95\xdd\x50\x87\xdd\xdf\x12\x33\xbe\x25\xe4\x60\x49\xc6\x35\x07\x30\x73\x57\x45\x09\xdb\x36\xc7\xb5\x07\x76\x9c\xc2\xcc\xd3\x15\x69\x22\x30\xff\x18\xa5\x6d\xdc\xfd\xdd\x83\x74\xf7\xa8\xbe\xf7\x6b\x3b\x42\x5c\x39\x16\x6f\x90\x38\xa9\x34\x73\xc5\x18\x2b\xa5\x16\xed\x18\x54\x43\xb8\xaf\xab\x21\xca\xde\xd4\x0a\x7b\x21\xc7\xde\x45\x59\x77\x2f\x03\xd6\xf0\x01\xf8\x1d\x74\x94\x08\xf8\xbf\x08\x07\xac\x23\x34\x2c\x9c\xca\x24\xee\xc7\xeb\xf7\xa3\x9b\xb3\xd3\x8f\x17\x7c\x63\x34\xa6\x67\x20\xf4\x6b\xe5\x29\xcc\x38\xc5\x54\xd3\x06\xca\x8b\xde\x03\xfc\x49\x3d\x6f\xaa\xed\x91\xdc\xb8\x04\x56\xfb\x24\x0f\x85\x2b\x0e\xfe\xc1\x7f\x2f\x51\x7a\x34\xab\x2e\x39\x18\xa1\xda\xee\x1c\xd4\xbe\x87\xb9\xf6\x69\x83\x66\xf5\x15\xde\x59\x06\x91\x6d\x3b\xe3\xf2\x69\xda\x18\x0a\x9f\x57\x40\x51\xb6\x71\x77\x56\x5b\xd2\xbc\xc0\xe2\x24\x12\x37\xd0\xce\xb8\x8b\x16\xdd\x48\xfa\xe8\xd8\x07\xe5\x53\xf1\xfc\x4e\xce\xc1\x20\x36\x36\xc0\x81\xd9\x58\x1c\x98\x8d\x31\x08\xfd\x6a\xf1\x05\x1c\x87\x3b\x29\xad\x0b\x8d\xd3\xc8\x69\x7b\x42\x82\x25\x49\xc4\x37\xd1\x61\x49\x46\xf3\xf2\xbf\xa6\xe9\xbc\x61\xaf\xd1\x9c\x67\x48\x26\x0e\xb1\xfb\x5b\x9a\xce\x3f\xa5\x2b\x12\xa1\xb6\xa7\x37\xe9\x81\x92\x06\x68\x0f\xfe\x53\xc5\x23\xb9\x37\xbb\x25\x4e\x2e\xae\x35\xc1\xdc\x95\x30\x77\x9c\x97\xf1\xdf\xe7\x34\x53\x52\x3c\x3d\xc9\x8e\xfb\x83\xc4\xfd\xe5\xe2\xcb\xed\xe5\xd9\xe9\x47\x3f\x71\x3f\x5c\x7f\xb9\xfc\xeb\xf5\xd5\xed\xe9\x47\x28\x07\x93\xf7\xed\x0b\x19\xb3\x91\x53\x2b\x0d\xcd\xa6\x18\xdd\x83\x95\x25\x5f\x56\x0f\xb1\xbb\xc8\xc8\xea\xbc\x86\x83\xa7\xa9\x62\xea\xe7\x1d\x30\x92\x51\x05\xb1\x86\x40\x4f\xa3\x45\xb5\xa6\xf2\x79\x62\xdf\x21\xc2\x96\xaf\x49\x99\x58\xb5\x2a\xbb\xb8\x94\xe4\x85\x0a\x0b\x49\x2e\xbe\x37\x82\x89\x43\xcb\x59\x0d\xb6\x78\xed\x28\x5e\x39\x4a\xbd\xb2\xfb\xe9\xf4\xd7\xd1\x2f\xa7\x1f\xbf\x5e\x14\xee\xef\x72\x12\x4b\x85\xea\xa8\xe2\x09\x4f\x3f\x01\x2a\xb3\x87\x31\xa7\x0b\xc5\xde\x28\x0c\xf5\x8d\x35\x01\xfb\xa0\xb3\x07\xb0\x31\x16\x04\xec\x83\x40\x59\x9a\x2d\xf9\xa9\xa0\xeb\x89\xc7\xdd\xcb\x93\x1c\x08\xd3\x99\x25\x4c\x51\x0c\x76\xca\x92\xba\x41\xba\x69\xb8\x1e\xb0\x40\xa7\xcf\x69\x7b\x7e\x82\xa2\xa3\x48\x3c\xca\xac\x34\x3b\x0d\x81\xb6\x36\x19\xa3\xc7\x31\x4e\xc6\x24\xc6\xf7\x31\x3f\x2b\x41\x31\x70\x7e\x06\x55\x57\x7c\xa3\x2b\xfa\x05\x46\xd9\x78\x71\x14\x62\xee\x18\xe7\x63\x1c\x91\x8b\x15\xe1\xe8\xcd\xc1\xb7\xe0\x58\x5b\x22\x04\x89\x6d\x27\xfa\x00\x44\x60\x26\xfb\xb4\x57\xbf\xf0\xf7\xc0\xd4\x09\x01\x2e\x58\xee\x9b\x4d\xff\xde\x66\xed\xb7\x69\xac\x9b\xb3\xdd\x8a\xb7\x4b\x45\x43\x8a\xba\xcc\x7a\x34\xd1\x6a\x24\x2a\xea\xad\x5d\xb9\x29\x01\xac\x50\x28\x0f\x1e\xa6\x73\x0a\x87\xa2\x28\x82\x5d\xaa\x67\x8a\x82\x17\x1b\x27\x9e\x37\xc8\xeb\xd9\x76\x9d\x5a\x20\x93\x3a\xe8\x57\xd4\x05\x07\x39\x40\x0d\x00\xcc\x4b\xe9\xe0\x10\x4c\x90\x96\x30\x29\xa4\xee\xba\x2c\x45\x13\x27\xe7\x29\x1d\xea\x3e\x08\xfb\x2c\xdb\x26\x6e\x94\xf2\x0e\xff\x3a\x12\x0e\xcc\xc5\x4b\x10\x3e\x8d\x57\x64\xcd\xce\xef\x63\x31\xda\xa8\xdd\xdb\x69\x5f\xee\xd5\xc3\xdb\xc1\xbe\x69\x22\xa8\x99\x71\x53\xcf\x4c\x7a\xc6\x8f\x1c\x4d\x3d\xab\xc0\x04\x71\x09\x13\x43\xea\x6e\xca\x52\x34\x71\x66\x3c\xa5\x43\xdd\x19\x80\xf1\xc9\xac\xec\xd9\xdd\xc8\x89\xe1\xec\x70\xcf\xcc\x71\x54\x96\x75\x46\xfd\x48\x3e\x54\x54\x5c\xed\x36\x5d\x8e\x67\x7b\xeb\x88\x09\xa2\x49\x12\x76\xae\x94\x4c\x00\x32\x97\x71\x50\x52\x3a\x13\x16\x42\xa9\x44\x42\xe7\xe4\x5d\x9a\x9d\xa7\xcb\xfb\x98\xdc\xe2\xc5\x27\xf5\x40\x3e\xa8\xbd\xbf\x97\x3e\x73\xaa\x78\xc4\x43\xf4\x47\xfd\xda\x47\xe5\x0d\x93\x50\xfb\x4b\x79\x5c\xe0\x29\xf9\xd5\xcf\x5c\xf1\x17\xf2\x7f\xef\xd4\xd7\x1d\x8c\xf8\x59\xcc\xaf\x9d\xca\x14\x28\x10\xb9\x77\x7e\xed\x14\xa3\x8a\x82\x1d\xd8\x89\xc9\x2f\x64\x1f\x51\x31\xa2\xd0\x43\x85\xa1\x0f\x28\xb2\x3f\xd3\x64\x3c\x3b\x23\x09\x23\x99\xb0\x40\x84\x58\x36\xb5\x58\x22\x39\x7a\x5c\x73\x22\xb1\xf1\xdb\xbd\x5d\x11\x27\xc0\x78\x88\x28\x64\x85\x7d\x64\xaa\x7b\xee\xab\x23\x61\x8e\x2b\x9b\xde\xa1\x43\x2f\xd4\xbd\x90\x3d\xae\x00\xdc\x95\x00\x77\x40\x0d\x42\x01\x20\x3e\x25\x80\xf8\xa9\xc7\xa1\x02\x70\x57\x02\xdc\x81\x9d\x52\x3e\x78\x3f\xf5\x8e\xc5\xe2\xfb\x7c\x29\x3d\x94\x61\x86\x93\xbe\xd3\xd4\x6e\x59\x77\xb7\x6c\x11\x2c\x5b\xdf\x3d\x58\xa0\xdc\xca\x5c\x0e\x49\x01\x4c\xdf\xfc\xa9\x27\x9c\x66\xfe\xa9\xd7\x4d\x41\xf3\xa0\xa6\x27\xaf\x7f\x74\x5f\xc1\x8d\x9f\xbe\xe9\xf7\xdd\x57\xbb\x5d\x81\x5e\x8a\x76\x8f\x6b\xbf\xaa\x35\x81\x1b\xbf\x72\x76\x2c\x4f\x4b\xcd\x8b\xfd\xe9\x45\x6c\x78\x07\xa9\x78\x5c\xa8\xad\x62\xda\xb4\x8a\xc5\x0b\xae\x67\x57\xf1\x4e\xf2\x9b\x54\x78\x0e\xae\x2e\x47\xe1\x83\x6f\x7f\x30\x03\xe1\x9c\x32\xd1\x8e\xdb\x93\x61\x2f\xf4\x8d\x85\x94\x94\x0b\x29\x69\x5c\x48\x49\xb9\x90\x92\x72\x21\xed\x54\x04\x06\x85\x29\x55\xb3\x19\x57\xda\x9c\xaa\x99\x8f\x55\xdb\x85\xcb\x19\x73\x3e\xdc\x35\x3f\x08\xef\xa5\xf5\x42\x71\x26\xa9\xa4\x6e\x86\xbd\x3d\xc8\xcd\xd0\x0b\x83\x99\x5c\xb9\x68\x26\xab\x3e\xde\xd3\x20\x1d\x2d\xa1\x84\xb9\x53\x30\x77\x7b\x30\xb3\xa3\x48\x3a\x0c\x84\x0b\x65\x39\xac\xc7\x0b\x8c\x91\x07\x17\xc8\x2b\x76\x69\x62\xee\x52\xe9\x41\x30\x2f\xc6\x4d\xf7\x3f\x18\x23\xa7\x1c\xcd\xae\x1a\x1d\x70\x3c\x55\x7a\x98\xa2\x44\x31\x36\xc1\xc2\x28\x71\xa7\x4a\xdc\x81\xe3\xc9\xce\x38\x59\xfd\x04\x0b\x06\xe0\x7a\xfd\x57\x5c\x28\x81\x8b\xc3\xd9\x0b\x75\x06\x1b\xa1\xb6\x27\xf9\x72\x6d\xc7\xb8\x6b\xdb\x76\x6a\x07\xd1\x58\x0e\x67\x57\x0d\x6b\xc7\x69\x98\x9d\xae\x02\x02\xc7\x63\xf8\x3c\xbc\x67\xc2\x0b\x87\xf5\xbd\x86\xdd\xeb\x6e\x40\xb9\x63\xbc\x72\x8b\xac\x0c\x8d\x8f\x50\x3e\x7d\x8f\x62\x27\xd8\x6c\xb7\xce\xaa\x72\xa6\x93\x4d\xb8\x53\xed\xbc\xdb\x6b\xe7\xa6\xec\xd7\x1d\x38\x5e\xc0\xe7\xe1\x3d\x13\x5e\xf5\x4b\xda\xb5\x57\x0f\x8e\x70\xc4\x25\xc6\x92\x11\x92\x26\x41\x9f\x9f\xef\x4a\x11\xbf\x34\xda\xac\x68\x78\xbf\xa3\xa4\x14\x08\x09\x14\x9b\x88\x8f\x3d\x34\xc9\x5b\xee\x00\x49\xe0\x48\x12\x35\xd3\x37\x3a\x71\xc4\x85\x53\x8d\x64\x01\x53\x02\xd0\xc2\x9f\xde\x12\x1e\x87\x1f\xcf\x78\x05\xd1\x6d\xb5\x98\x32\xc9\x17\xc1\x00\xce\x31\x23\x80\xf7\x80\x13\x4f\x47\x1e\x79\xaa\xa5\x86\xbd\x30\x38\x48\x60\x6d\x9b\x76\x0f\x66\x9e\xbc\xea\x49\x49\x4c\x27\xfd\x6a\xdb\xe6\x19\xb6\x48\xee\x26\x6e\x3e\xce\x08\x49\x7e\x05\x27\xaf\xaa\x45\xee\x9a\x8b\xdc\x15\x45\xee\x78\x91\x01\x71\x33\x92\x13\x71\xc2\x77\x84\x02\xfc\x10\x43\xa0\xd0\xac\x18\x15\x15\x9b\xc9\x77\xa8\x44\xbe\xd3\xac\xb5\x3e\x27\xfa\xe6\xe6\x84\x0c\x48\x97\xf9\xec\x0d\x1e\xb0\x2e\xf6\x7b\x35\xd3\x7b\xfd\x12\x17\x25\xee\x84\x26\xd1\xe7\x34\x77\x88\xf6\x10\x02\x20\x45\x8f\x31\x99\x30\x1f\xbb\x6b\x69\x0f\xc4\x7f\x75\x0a\x00\x37\x9d\x4c\x72\xc2\xe4\xeb\x3f\x96\x2e\x7c\xec\x6e\xa0\x7c\x1c\xc4\x7f\xee\x01\x4a\x01\x78\x07\x33\xce\x52\x13\x49\xdf\x1c\xc6\xd9\xa9\xfc\xb8\x13\x6f\x17\x73\x94\x3a\x99\xbb\x86\x5c\xb4\x99\x30\x48\x5d\x51\x33\x80\xb1\x48\xdf\x40\xea\xb2\x74\x01\xa9\x2b\x2b\x2a\x2e\x90\x0a\x32\x96\xc3\x18\xec\x82\xac\x62\xc9\x82\x1e\x85\x3d\x4f\x94\x3e\x24\x7e\xc3\xea\x6d\x33\xf7\x7e\xc9\x58\x9a\x6c\xb7\xfd\x36\xd2\x1f\x86\x40\x45\x7f\x23\xe2\x2c\x73\x9e\x3e\xe8\x72\x90\xb9\x38\x66\x3f\x93\xcd\x76\xcb\xdc\x7c\x46\x27\xfc\xf7\xa0\xbc\x96\x51\x60\xbe\xa1\xdc\xa9\x1e\x80\x6a\x57\x6f\xc6\x31\x0a\x3c\xe6\x62\x6a\x4e\xbc\x5e\x6f\x50\x6a\x78\x34\x46\xf5\x6a\xbf\x3c\xbf\x08\x39\xb9\xd4\xee\x94\xf2\xb8\xd4\xe8\xf0\xef\xfd\x73\x1b\x90\xe7\x13\xe3\x92\xc8\xb6\x0b\x95\xaf\xaa\xca\x7c\x4f\xd2\x62\x4e\x5a\x51\x47\x0d\xf6\xda\x31\x28\xce\x8d\x4e\xaa\x3b\x7f\xf0\x30\xa8\x20\x6a\xf5\x4b\x65\x99\xca\x84\x89\x8a\x93\x21\x4e\xb2\x4e\x94\x8e\x45\xc0\x10\x68\x89\xc9\xe4\x19\x9c\x6e\x3f\x0d\xb5\x5c\x58\x90\x09\x0d\x97\xbe\xed\xde\x05\xc4\xc5\x51\x74\x9a\x44\xb7\x19\x1e\x7f\x7b\x1a\xf7\xf3\xa0\xbc\x82\x94\x13\xc8\x07\x1a\xc7\xe7\xb2\x12\x65\x72\xff\x69\x23\x22\x65\xb5\x7b\x50\x10\x46\xb1\x0e\xf6\x96\x5f\x03\x91\xdc\x49\x78\xde\x88\x06\xf0\x42\xce\xac\x42\x93\x24\x6a\x00\xd6\x34\xbb\x80\x8d\xd4\x31\xae\x69\x1b\x34\x1d\xf7\xf4\x15\xf0\x2a\xa5\x91\xd3\x7c\x1e\xf4\xf4\x8a\x7e\xfc\x2e\x0d\x05\xac\x28\x3d\xf8\x6c\xd4\xf5\x15\xba\x8d\x7c\x06\xf8\xee\xda\xdf\x67\xdb\x6d\x85\xa2\x0a\xf6\x94\x28\x83\x42\x3c\x66\x74\x45\xc4\xb6\x1f\x3d\xb5\xef\x9f\xda\xdc\x3b\xa8\xe6\xf6\x89\x15\xcc\xeb\xe4\x7d\xba\xe4\xeb\xf7\xb2\x66\x51\xf7\x47\x2b\x86\x7b\x04\x44\x35\xa5\x71\x31\x3c\xb3\x79\x75\x1f\x9e\x29\xa6\xf6\x9c\x2a\xf5\xfb\xac\x16\xaa\x36\x37\x2f\xfe\xc7\x76\x81\x1c\xb2\xef\xa9\xfb\x13\x93\xa6\x25\x68\x18\xca\x4f\xed\xcb\xa2\x48\x10\xa1\xe9\xb0\x3c\xa4\xea\xb4\xcd\x29\x17\x6a\x51\x19\xd8\x68\x2d\xac\xae\xcc\x94\x8d\x91\x52\xb5\x23\xc2\x51\x74\x8e\x19\xce\x09\x6b\xb2\x26\x92\xcd\x91\x67\x49\x02\xaa\x6d\x92\xa9\x6c\xdf\x1e\x47\x7b\x1a\x6b\x08\xd6\x53\xb8\x51\x18\x55\x4b\x8d\xd3\xf9\x62\xc9\x48\x53\x49\x69\xc8\xf3\xb8\xf6\x7b\x70\xe3\xf7\x76\x01\x73\x1f\x6a\x7e\x26\xe4\x25\x7d\x97\xb9\xeb\xee\x41\x07\x14\xda\x6e\xd9\xe2\x1c\x7a\x56\x77\x48\x26\xaf\xca\xf5\x92\x18\xcf\x70\xc6\x46\x11\x5d\xd5\xfc\x44\x88\x3f\xe7\x74\x05\x39\x8d\xc9\x56\xe4\x66\x81\xc7\xe4\x23\x97\x84\x8a\xe6\x16\x82\xd3\xe3\xda\x67\xee\x1a\x6e\x7c\xe6\x6e\xe0\x83\x4f\xe0\xcc\x67\xee\x6c\x57\x58\x01\xb9\xeb\x0e\x22\x90\xb9\x0f\x5d\x44\x20\xde\x55\x50\x7e\x11\x32\xd5\x21\x9c\x1d\x5e\x88\x3c\x81\xb9\x09\xe5\x6d\xba\x78\xbe\x91\xcc\x7d\x80\x33\x9f\x18\xa8\x36\xb2\x91\xb3\x06\x8c\x6f\xa5\x40\xf7\x34\xd2\x0e\x2f\x4b\x1a\x51\x6b\x9c\x62\xb0\xb9\xf0\xb1\xff\x5c\xb1\xb1\x79\xbc\xaf\xbb\x5d\x50\x77\x5e\x57\x65\x15\xca\xf3\x34\xd4\x4b\x56\xac\x38\xc4\xf6\xec\xd3\x4e\x8d\xdd\xb4\xb7\x35\xab\x5b\xcd\x08\x30\x77\x70\x91\x99\x36\xf0\x16\xd8\x6e\x9b\x8c\x00\x77\xb0\xe6\x82\xdd\x78\x6e\x2c\x89\x51\x9b\x53\x11\xf1\x64\x4a\xdb\x0b\x21\x84\x64\x9a\xc9\x76\x5b\xda\xeb\x02\x91\x31\xb4\x8c\xbe\xb4\xe6\xcb\x9c\xb5\x66\x78\x45\x5a\x38\x69\xfd\xb0\xfe\xa1\xb5\x50\x24\xcb\x12\x5a\x75\x81\x8c\x8e\xd3\xc4\xb6\x55\x6d\x55\xc2\xe6\x58\x62\x4b\xf1\x2e\x34\x67\xcb\x0d\x63\x01\xf0\x54\x83\x3e\xf1\x46\xe4\x84\xb5\x04\xb2\x16\x4e\xa2\x96\x2c\xd7\x7a\x98\x11\x11\x91\x91\xd1\x64\xda\x2a\x87\x59\x34\xc9\x6c\x6a\xe2\x4a\xc7\x47\x0e\x85\x82\xb2\x42\x2a\x86\x65\xbb\x75\xe4\x0f\x44\xf8\x0f\x00\xf6\x48\xa3\x24\x4d\x54\x4a\x00\x95\x19\xff\x55\x10\xc2\xfd\xc9\xd6\x24\x73\x7f\x8d\xdc\x71\xea\xba\x5f\x40\x11\xdd\x1a\x3c\x51\x1e\xaa\xf7\x9d\x03\x8a\xd3\x37\x7a\xdc\x29\xb7\x80\x1a\xf0\x23\x9d\x53\xc3\x5b\x60\x99\xac\xfc\x23\x35\x67\x89\xc6\xee\xe5\x18\x2b\xc0\xa9\x51\xe5\x5a\x7d\xfb\xf4\xb5\xba\xa6\x2b\xaa\x02\xa3\xfd\xee\x9c\x26\x7c\xdc\xd9\xb0\xa7\x78\x8f\x4e\xc7\x6b\x99\xee\x85\x8a\x8a\xf2\x9f\x5d\x0e\x57\x29\x2f\xd4\x2a\x48\x18\xc0\x0d\xbc\x63\xe2\x7b\xf0\xc0\x66\x3a\x60\x2b\x61\xdb\x8e\x89\x6e\x1d\xa7\xd3\xac\x62\x4c\xb3\xdf\xa8\xd2\xb4\x66\xbf\x23\x00\xd6\xb1\x95\x0d\x6c\xac\x67\xe0\x1d\x37\xa6\xfb\x1e\x08\x6a\x21\x16\xca\x45\xd2\xb0\xd3\x8d\x5c\xe1\x62\x40\x3f\x71\x45\x54\xb3\xc2\xa8\xb4\x5c\x10\xa6\x54\xbc\x37\x87\x21\x3c\x11\x00\x40\x0e\x45\x01\xda\x2d\xd0\xf2\xcc\xb2\x67\x1a\x72\xe0\x1d\xeb\x9f\x87\x27\xc2\x74\x5b\x6c\xdb\x0e\x75\x37\x7b\x63\x5e\x54\x58\x0e\x75\x51\xb3\x88\x33\x50\x19\x57\x03\x83\x6c\x40\x39\x86\x90\xe6\xef\xb8\x10\x4c\xcc\x6a\x8c\x28\x0d\x46\xe2\x76\x5b\xa3\x36\x78\x4d\xf3\x96\xd5\xc1\x1d\xab\x95\x4e\x5a\xa2\x17\x2d\xcc\x5a\x56\x87\xba\xd3\x8e\xd5\x1a\x0b\xa7\x34\xf7\xa4\x15\xd1\x7c\x11\xe3\x0d\x89\xb8\x88\x17\xa7\xd3\x96\x68\x59\x6b\x92\x66\x2d\x81\xb9\x35\xe4\x45\x54\xeb\x3b\x56\xab\x2b\x50\xa8\x0e\x76\xac\xd0\x52\x6a\xaf\x31\x8e\xc7\xbf\xaa\x48\x09\x87\xd4\x2c\x78\xe0\x14\x6b\xaf\x1c\x1b\xa2\x17\x1f\x38\x22\xe5\x9a\xf3\x1d\xd6\x2d\x72\x8e\x88\xdc\x29\xba\xa2\xbb\x43\x15\xf1\xe3\x99\x5e\x53\x5e\xb7\xa8\x8d\x18\x8b\xbe\x98\x09\x70\xc4\xca\xa9\xd0\x8c\xb8\x1c\x71\x30\xa0\xfe\x15\xbe\xd2\x1e\xf4\xbc\xae\x43\xba\x65\x61\x5e\xb6\x68\x52\x23\x5d\xd1\x04\xeb\x09\xff\x74\xcd\x9e\xc1\x2a\x2f\xe6\x0f\x72\xd7\x03\x04\x01\x1a\xbb\x4d\x09\xab\xe6\x6e\x33\x4c\x27\x4a\x08\x19\xe8\xa4\x22\xcb\xf2\xa4\xf4\x70\x23\x0f\xbd\xfb\x4e\x00\xac\xbb\x96\x3b\xf4\x98\x3d\x01\xb0\xee\x66\x6e\x5f\xfd\xac\x60\x8d\x3e\x26\x00\xce\x50\x2f\x98\x95\xc1\x99\x67\x9a\x8a\x2c\x11\x1d\xce\xc2\x60\xe9\xae\x51\x75\x39\x3a\x4b\xf9\xe0\xda\xa0\x54\x90\x68\xd7\xaa\x4b\xe1\xe8\x35\x60\xb6\xed\x2c\xcb\xf7\xb7\xa8\xba\xce\x9c\x1c\x4a\x38\x9d\x0f\x63\x00\xff\x97\x0e\x49\x58\xc4\x23\x04\xdb\xad\xa3\x31\x16\x2f\x7d\x81\x7e\x11\x1c\xd9\xb6\x13\x89\x27\xc2\xe9\x76\xeb\x48\x28\xfe\x09\x00\x47\xbe\x5f\x23\xaf\x64\x57\x1d\xa1\x08\x33\xfc\x41\xfa\xba\x1e\xd5\x63\x40\x38\x14\x0a\x9d\xde\x13\x0b\xb2\xc6\xeb\x15\xaf\x2b\xbd\x99\x0a\x92\x2d\xd9\x3f\x13\xa0\xfc\x44\x25\xfc\x4b\x98\x32\x81\xe9\x6a\x42\x2d\x4f\x95\x33\x64\xa1\xf0\x79\x21\x9e\x73\xc2\x0c\xb5\xb9\xe4\x79\x4f\xe2\xd1\xca\xa2\x49\x8b\xf0\xd3\x68\x36\x20\xee\xca\x57\x20\xa3\x15\x74\x68\x6d\x11\xb0\xf4\x33\xc9\xc6\x24\x61\xea\x16\x39\x01\x40\x78\xf3\xa7\x27\x9e\x7a\x9b\x21\xdb\xa6\xef\xf3\xd2\xdc\xa7\xf2\xfd\xa8\x8f\xe1\x0c\xe7\x23\x9e\xeb\x67\x3b\x50\x76\x66\xd3\xd4\x99\x2a\x2b\x62\x86\xe7\xc0\xb4\xc2\x8d\x58\xa8\xec\x01\x53\x57\xd6\x6b\xd8\x03\x12\xa4\x12\x87\xf9\x3f\xb1\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\x71\x3d\x58\x43\xd4\x45\xc7\x3c\x57\xfc\x33\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\xbc\x7a\xaa\x0b\xf4\x90\xc7\x84\xe4\x5f\x1b\x1d\x27\x6b\x56\x05\xa6\xff\xb6\xaa\xc0\x7d\x67\x09\x2a\xbb\xcb\x45\x82\x5c\x3c\x25\x49\x1a\x1c\x25\x48\x2f\x8a\x79\x37\x23\x13\x92\x91\x64\x2c\x03\xc9\x3a\x89\x33\x03\xf0\x59\xcd\xa2\x3a\xb0\xea\xb5\x2d\xc4\x82\x51\x71\x20\x95\x24\xab\xfc\x9e\xc6\xe9\x3d\x17\x38\xf7\x25\x96\x5c\x05\x2c\x58\xe6\x24\xab\xe7\x8b\x34\x09\xb4\xdd\x6a\x54\xd2\xd9\x41\x59\x73\xcd\xd9\x82\xc2\x21\x22\xa4\x34\xb8\x70\xb0\x40\x89\x29\x23\x22\xc6\x93\x92\x92\xc0\x4e\x28\x33\x96\xee\xe9\xaf\x97\x37\xa3\x9b\xdb\x2f\x97\x57\xef\x47\x9f\x4e\x3f\x7f\xbe\xbc\x7a\x7f\x33\x42\x8f\x1b\xbf\x07\xef\xfc\x1e\xdc\x78\xfc\x07\xff\x67\xd3\xf7\x3d\x78\xd7\xf7\xbd\x1d\x5c\x0a\x41\xed\x36\x15\xde\xac\x46\xf5\x95\x62\xf1\x25\x9c\x4c\xcb\x90\xfa\x32\xf9\x40\x55\x75\xf5\x08\x2b\xd4\x22\x07\x0a\x70\x96\x21\xa3\x37\x7c\x4d\xbe\x25\xe9\x43\xd2\x12\xa7\x17\xbf\x65\x75\x18\x67\x19\x96\x7c\x8a\x5b\xaf\x5e\x79\x6e\xf4\xf8\x9f\x72\xf1\x4a\x44\xe7\x72\x0a\xf2\x56\x9a\xc4\x1b\x1d\x06\x22\x6f\xb1\x87\xb4\xb5\xe9\xe2\x35\xc9\x61\x8b\xf2\xae\x92\xa8\x35\xc9\xd2\x79\xab\xd7\xf5\x5c\x4b\xb0\x27\x70\xa8\x25\x41\x11\x60\x1d\x2e\x2b\x14\xdd\x98\x84\x03\x8a\x04\x19\xee\x46\xcc\xbb\xd2\x38\xa9\x45\xa9\xd7\x02\x2b\x7d\x83\x55\x16\xe7\xa3\x5c\x87\xfe\x30\x84\x6a\xb1\xfb\x8f\xbb\x5d\x6d\xc9\x1a\x39\xf5\xc5\x5b\xd7\xd2\x89\x05\xa9\xf2\xc5\x3a\x32\x8e\x0b\xaa\x2d\x87\x4e\xe7\x2a\x5b\x47\x45\xa4\xa1\x28\x9f\xa1\xea\xca\x71\x12\xf1\xa9\xb4\x24\xaa\x21\x43\x1a\xa2\x47\x1a\xad\x7d\x0c\x85\xc1\x84\x9f\x15\xbd\x49\x76\x66\x87\x87\x59\x38\xa8\x7e\x2a\x14\x5a\x81\xe5\x57\x73\x51\x31\x3e\xb4\x32\x40\x3b\x15\xd9\xa9\xec\x32\x9f\x72\xde\xe0\x20\xd5\x3a\x34\x13\x53\x2f\x74\x55\x69\x98\xbb\x1b\x0e\x57\x99\x07\xc3\xc2\xa4\xb1\xb8\x57\x29\xde\x97\xe5\xab\x90\x72\xae\x0c\xb0\xb5\x80\xda\x55\xd7\xd2\x94\xb0\x26\x6f\xb6\x6a\x09\xbd\x17\x34\xe8\x2b\xef\x8f\xc3\x0a\x5a\xaa\xee\x97\xc9\x80\xf8\x55\x40\x65\x33\x3a\x12\x57\x12\xb5\x5a\x0c\x54\x8d\x4f\xb3\xcb\x81\xdb\xdb\xcb\x83\x32\x73\xc8\x42\x15\x6e\xa3\x11\xbd\x6e\xc0\xc1\x1a\x14\x51\x3d\x54\x87\xca\xe6\xb5\x94\x9e\x37\xf6\x61\x8b\xbc\x83\xcd\x51\x67\xe5\x66\xdf\xea\x41\x13\x81\x21\x00\x23\x02\x29\xe2\x24\x06\x0f\xac\x8d\xe5\x5b\x9b\xbe\x55\x04\x29\xb0\x36\x9e\x85\x10\x11\xef\xb4\xad\x8d\x05\xa0\xb5\xe1\xdf\x80\xef\x26\x6d\xba\xc3\x0b\xc8\x34\xaf\x2c\xb7\xb6\xda\x88\x34\x51\x18\xab\x43\x02\x8c\xba\xde\x8e\x22\xb2\x93\x92\x6b\xd7\xe3\x75\x1b\xab\xc7\xaf\x6b\xc9\x26\x4e\x52\x48\xae\x7a\x69\xf1\xd4\xec\x30\x05\xce\x86\x4c\x44\x74\x10\x2d\x41\x64\xbb\x2d\xcf\xd6\xed\xc2\xf3\x79\x7a\x68\xc9\x95\x51\x43\x53\x8d\x30\x55\x7b\xad\x9c\x21\xf1\x1e\x8a\x86\x45\xd4\xf3\x86\x29\xe3\x87\x84\xdf\xb1\x5a\x0b\x4d\x40\x6d\x06\xe9\xc4\x21\x08\xed\xab\x29\x3e\x54\xd9\xa6\x03\xd4\x51\xa2\xce\x69\x0f\x0f\x53\x23\x38\x67\x53\xe2\x3e\xc2\x20\x6d\x75\x14\x04\xd4\x66\x57\x11\x28\x31\xc1\xc6\x81\x49\x53\x46\x15\x78\x40\x4f\x9e\xd6\x42\x35\x8c\x19\x35\xc7\x4c\x6b\x7f\x18\xc4\xd2\x06\xad\x36\x68\xc9\x72\x5e\x55\xd3\x57\x37\x5e\x85\xac\x55\x4b\xf2\xd5\xd8\x34\xde\x55\x04\x79\x31\x22\xb2\xfa\x7d\x1c\x52\x55\x74\x18\x43\x71\xbc\xd6\x7d\xaf\xa2\x90\x15\xec\x6f\xdc\x43\x48\x24\x7c\x13\x0e\x79\xb6\x39\x30\x10\x8a\xa9\xed\x4a\x7f\x10\xd4\x3c\x1f\x2c\x7f\xff\xf9\xe0\xa0\x10\xeb\x7b\x3d\xf8\xa4\xec\xea\x7b\x2f\x1b\xdd\x74\xc0\xea\x91\xe3\xf5\xff\x58\x0f\xec\x5b\x0f\x94\x3a\xac\x62\x7e\x53\x95\xba\xbf\x76\xaa\x24\xcf\xb6\xa9\xa0\x39\xbc\xec\x2e\xc0\xda\x51\xcb\x47\x9a\x10\x9c\x49\x8d\x59\xd6\x68\x3d\x28\x43\x3f\xa9\xb7\xf1\x2a\x86\xfe\x18\x51\xc7\xaa\x7a\xa1\x11\x6e\x4f\x65\xdc\xc0\x54\x0c\x89\x56\x27\x19\x8a\x24\x15\xe6\xe5\x71\xe5\xa7\xc3\x3c\xdc\x81\x82\x61\x50\xf3\xba\x01\x3c\xaa\xa7\x64\x93\x38\x4d\x33\x07\x1f\x8f\xe5\xe4\x4d\x51\xe2\xde\xd3\x04\x67\x9b\x1b\x82\x33\x61\xc5\x14\x41\x0f\x08\xbf\xea\x95\x74\x02\x23\xd8\xf5\x40\xc0\x39\xcb\xd4\xb6\x9d\x29\xea\x01\xc8\x3f\x26\xb6\xed\x4c\x50\x54\xf8\x55\xd5\xc6\xcd\xfa\xf4\x3c\xe9\x4e\xdf\xa0\xe5\xf1\xcb\x52\x81\xbc\x42\x93\x60\xf5\x06\x4d\x83\x95\xf6\xa5\xba\x41\xd1\x70\x15\xc2\xb5\x6c\x62\x9c\x4e\x9d\xcd\x31\x03\xc7\xc5\x17\x39\x66\xe0\x08\xc3\x39\x7a\x5c\xf9\x9b\x5d\xa0\x94\xa2\xa3\xc1\x08\x3d\x32\x3a\xfe\x26\x2e\x6f\xfc\x8d\x74\xe1\x33\x1a\xa7\x69\x16\xf9\xeb\x9d\x5f\x98\x8d\xae\xbb\x23\xd7\xc8\x03\x6f\xd0\xf8\x99\xa2\x73\xb9\xbb\x91\x65\xc1\x85\x7e\xcd\xbd\x5b\xb8\x19\x59\x91\x2c\x17\xcf\x11\xd4\x19\x62\x51\x31\xa9\xbd\x87\x0f\xf0\x94\x4f\x63\xe9\x94\xce\x02\xc1\xe9\xc0\xb9\x47\x43\x0f\xf6\xe1\x4b\xf8\x13\xf4\x5e\xc3\x17\x7d\xf8\xfa\xa5\x70\x16\xd6\x7f\xf5\x3a\x84\x0f\xc8\x7b\x0d\x7c\x0d\xf3\x0a\x7a\x3d\xd8\xef\xc1\x57\x3d\xe8\xf5\x7a\x22\xb7\x07\xb4\x1b\x56\x78\x01\x3f\xca\x41\x1a\x13\x1a\x8b\x69\x84\xb7\xe5\x73\x0c\xd2\x65\xe0\xf8\x23\xbc\x31\xa7\xba\x18\xc4\x5b\x63\x40\x1f\x00\x80\x9f\xcb\xb7\x85\x0f\xf0\x46\xea\x3c\xe5\x23\xc5\xfb\xd2\x97\xcc\x35\xfa\x7c\x74\x3f\x8c\x43\x78\x6e\xe2\x64\xc7\xd7\xe0\xe8\x1a\x5e\x18\x4d\x21\x32\x69\x59\x36\xe6\xa2\x7b\x0e\x8e\xaf\x61\xdb\xc1\xc7\xcb\x37\x63\x00\xc4\x3b\x47\x51\xcb\xf9\x9b\x0b\x8e\xfa\x08\x75\x3d\xa0\x03\x42\x2e\xc5\x62\x9e\xa1\xf3\x4e\x7e\x74\x0d\xcb\x45\x3d\xdb\x29\xef\xde\x67\x7c\x5c\xf7\x9d\x2d\x29\x7f\x0b\x12\xcb\xc2\xdc\x18\xc5\x7d\xff\x62\x98\x87\x72\x3e\x6d\xdb\x29\x3f\xd0\x99\x24\x1b\x19\x14\x69\x2b\xd8\xe3\xbb\xb2\x88\x23\xd9\x5a\x18\x3b\x5a\xee\xe5\x54\x45\x7d\x6d\xa6\x1d\x72\x9f\x8f\x0b\x47\xc4\x1a\x4f\xfa\x06\xf5\x06\x53\x91\x9c\x8a\xd8\x48\xfe\x30\x14\x3e\x9c\x0a\x87\x5a\x28\x57\xa1\x73\x1e\x3f\x5d\x7e\xfc\x78\x79\x73\x71\x76\x7d\x75\xfe\x91\x9f\xb7\x6f\xff\x72\x3d\xaa\xa6\x79\xf0\xdd\xe5\x2f\x17\xb5\xc4\x3e\xbc\xbd\xb8\xaa\xa5\xbd\x80\xef\x2e\xdf\xdd\xde\xd5\x52\x5f\xc2\x0f\x5f\xaf\xce\xbf\x5c\x9c\xd7\xd2\x5f\x49\xb4\xcd\x99\xaf\x61\xf1\xf3\x47\xd1\xa4\xe2\xf3\x27\x59\xac\xf8\xfe\x93\x68\x48\xd9\xd8\x1e\xbc\xfd\x70\xf9\xe5\xf6\xce\x48\xf2\xe0\xa7\xcb\xab\xaf\xb7\x17\xfc\x77\x5f\x75\x50\x7f\xbf\xd0\x9d\xd3\x09\x2f\x55\xc7\xf4\xf7\x2b\x8d\xaf\x4c\x7a\x0d\x3f\x5c\x7f\xfd\xc2\x7f\xc9\xb6\xe9\xaf\x9f\xe0\xcd\xe5\xaf\xc5\xd7\x9f\xe0\xf9\xe9\x25\x1f\x29\x39\xa6\xea\xc3\x83\x7f\xb9\xb8\xf8\x99\xff\xea\xc3\x4f\xd7\x57\xb7\x1f\xf8\xcf\x17\xf0\xcf\x5f\x4f\xbf\xdc\x5e\xf0\x72\xfd\x97\xf0\xed\xe5\xe9\xd5\xd5\xd7\xd3\x8f\x7e\xff\x15\xd4\xbf\x5e\xc3\xf3\x8b\xb3\xd3\x73\xfe\xf3\x47\x78\x76\x71\x75\x7b\x71\x75\x75\xc9\xbf\x7e\x82\x57\x5f\x3f\x8d\xde\x7f\x39\xbd\xfa\xfa\xf1\xf4\xcb\xe5\xed\xe5\xc5\x8d\xdf\xff\x13\x9f\xed\xf7\x19\x4e\x96\x31\xce\x28\xdb\xa0\x58\xbf\xd2\x39\x3f\xbd\xbd\x78\x77\x79\xf1\xf1\x7c\xc4\x27\xbb\xfc\xfa\xe4\x7b\xc6\xd7\xb9\xdf\x37\xbe\x3e\x7c\xf0\x5f\x98\xa0\x9f\xfc\x97\xc6\xe7\xcd\x8d\xff\xca\xcc\xbd\xf1\x5f\x8b\x26\x15\x49\x37\xfe\x8f\x3b\xb8\xe4\x4c\x65\x39\x8c\xdd\xca\x3c\x87\xe8\x91\xaf\xc9\x09\x25\x71\xe4\xcf\x5c\x13\x8b\xf0\xd0\xe8\x7b\x30\x5f\xe0\x31\x4d\xa6\x42\xeb\x33\x8c\xdd\xbd\xe5\xf9\x2c\x8a\x7e\x81\xa2\x2f\x51\xec\xaf\xe6\x67\x71\xbc\x2a\x70\xbc\x52\xcd\xa8\x2f\xfe\xe7\x7b\xd2\x2b\xbb\xd2\xd3\x0d\xd9\xdb\x2d\xcf\xb7\xa4\x44\xf3\x4a\xa1\x69\xdc\x41\xdf\xd1\x1e\xb3\x41\x3d\x63\x68\xfe\x18\xbe\x57\x3d\xb3\x65\x0a\xdf\xb3\xa5\x6f\xf6\xe7\x99\xbc\x28\x67\xfa\xbb\xcb\x1b\x93\xac\xcb\x57\xc8\xc4\xb3\x08\x8c\x19\x2e\x1a\x60\xd0\x95\xe7\x3b\x60\x8c\x26\x79\xa9\x10\x54\x09\xd1\xb3\x38\x5e\x94\x38\x5e\x68\x1c\x9a\xea\x1c\x1e\xff\x4f\xf5\x11\x7c\x5d\xd4\x6f\x50\xba\x67\xcb\x97\x23\xe8\xf5\x35\x82\x0a\x69\x7c\x16\xc3\x2b\xa3\xf5\x95\x6d\xf2\xbd\x3d\xe8\x19\x5d\x78\x55\x19\xc2\xef\xc6\x61\x0c\xa1\xf7\x93\x46\x22\x29\xf2\xc1\xb2\x1f\x3e\xd4\x47\xf0\x45\x59\x7f\x41\xde\x9f\x2d\x5e\x0e\xe0\x8f\x7d\x5d\xbc\xe4\x07\xcf\x16\x7f\x5d\xae\x60\xaf\xa8\x5e\x30\x8d\x83\x45\xcf\xeb\xed\xfe\xe9\xf5\x4b\xb3\xe1\xdf\x55\xda\x98\xf7\x1f\xfb\xc5\x90\x49\x26\xf5\x5c\xd9\x1f\xcb\x09\xeb\xbd\x2c\xca\x2a\xb6\x76\x78\xae\xea\xcd\xee\xbf\xee\xff\xe9\x27\x5e\xbb\xa2\x1a\x05\x33\x7c\x0e\xc5\x8b\xea\x98\x1d\xbd\x78\xfd\xca\xed\xbf\xea\xab\xd5\xab\xd9\xe8\x73\x58\xca\x91\x7f\xf9\xa2\xbf\x87\xe5\x19\x1c\x77\x8d\x73\x50\xc3\xa1\x58\xf7\xb3\x48\x8c\xfd\xef\xbd\x7a\xf5\xe3\x4f\xbd\x1f\x5f\xbc\xd6\xa4\xb4\xe4\xf9\xcf\xa3\x69\xc2\x43\x5e\xec\x94\x0d\x49\xa3\x85\x8f\x70\xb5\xd8\x7d\xf1\xa7\x80\x9c\x20\xfe\xaf\x61\x61\x80\x4b\xa9\xdd\xeb\x41\x02\x20\x45\x5e\x40\x4f\xd0\x9f\xcc\x8b\x6b\x7c\x44\x03\xe5\x3e\x31\x29\x82\xda\xb3\x9d\x08\x7d\xba\x1f\x30\xc3\x88\x8e\xd1\x70\x00\x95\xe1\xf5\x63\x77\x4f\xb0\x91\x91\xf6\xe9\xc4\xc1\xc7\x0b\xe5\x74\xe3\x0d\x4a\x0a\x65\xa1\xaa\xb6\xeb\xed\xe0\xa2\xd9\x81\x1e\x5a\x0e\x71\xe8\xaa\xc1\xa9\x3c\x32\x93\xe1\x69\xbc\x23\x79\xa0\xa1\x60\x07\xa7\x0d\x07\x68\x2d\x72\x1f\x38\x17\xc0\xbc\x3c\x89\x7d\xbd\x3d\xb3\x00\x8c\x50\x3e\x48\xdc\x73\xcc\xc8\xe9\x78\x4c\xf2\x3c\xcd\x78\x86\x5f\x4b\xfa\x98\x8e\x71\x0c\xc7\xb2\x75\xc5\xdc\xc2\x85\x6a\x2e\x23\x0b\x38\xad\x34\x9d\x1f\x96\xd5\x43\x4a\x87\x01\x38\xe2\xc2\xd5\x68\x58\x59\x0b\x21\x8a\xe4\x23\xd1\x38\xbe\x23\x38\x73\x26\x00\x56\x21\x3e\x29\x88\x4f\x69\xc2\x66\xfb\xd9\xe7\x2a\x5b\xd4\xb1\x97\xfb\xe1\x83\xca\xfe\x90\x2e\xb3\xbc\x01\x79\x81\x9d\x26\x4b\x46\x1a\x20\x6e\x6e\x14\xc4\x0d\x19\xa7\x49\xd4\x84\xe3\xa6\xc0\x11\xc7\x34\x2f\xc0\x54\x74\xe5\xd1\x70\x1c\xfe\xe7\x22\xc0\x08\x69\x72\x25\x82\x64\xa8\x46\x6f\x9c\x09\xe0\x08\xc7\x61\x17\xad\x8a\x7b\xa5\x0d\x1a\x77\xbc\x60\x73\x32\x73\xab\x12\x6a\xb0\xe9\x74\xc0\x68\xb8\x09\xd1\x46\x04\x0e\x36\x86\x61\xe0\xf9\xd2\xcd\xe2\x9a\xef\x91\x39\x8a\xdc\x39\xfe\x46\xf8\xa8\xb8\x78\xb1\x88\x37\x42\x7f\x04\x47\x00\xde\xa3\x79\xf9\xa6\x55\xbc\xb2\x3e\x41\x9a\xf7\x88\xbd\x74\x7f\xc2\x6c\xdb\xb9\xef\xa0\x29\x9c\x97\xd3\x77\x0f\x40\x70\x7f\x82\x48\x00\xd6\xc5\x09\xf4\x5e\x19\xc8\xa4\xfa\xb8\x38\x57\xcb\x6f\x07\xe0\x7e\x79\xa9\xc3\x2f\x6b\xe0\x9d\xee\xa0\xc5\x77\xb7\x55\xd7\xef\xe0\x37\x48\xb1\x9c\xed\xd6\x98\xdc\x39\xf8\xcf\x05\x42\x3d\x60\xdb\xdf\xd7\xc2\xdf\x5b\xbf\xde\x87\x6b\x7e\x68\x51\x2b\x4e\xe8\x51\xa7\x4f\x58\x63\xfc\xf8\x3b\xe2\x3d\x68\xef\x24\xc6\x8b\xc2\x8f\x34\x67\x24\x21\x99\xc3\x37\x76\xdb\x03\xbb\x66\x6b\x07\xc4\xb6\xdb\x07\xf1\x20\xde\x15\x8e\x4d\x44\x6c\xa8\x74\xf1\x39\x4b\x17\x78\x2a\xac\x6a\x6c\x7b\x2f\x49\xb8\x3d\xa9\x7a\x42\xe1\x50\x0d\xbe\x51\xe4\xa3\xb9\xb7\xcb\xfb\xfb\x98\xa0\x76\xaf\x48\x91\xbf\x65\x23\xa4\xf7\xc0\xb6\x07\xdb\x5e\xd9\xc8\xac\xea\x16\x34\x81\x59\xa0\xb4\x43\x04\x50\x84\x61\x82\x30\xcc\xcc\x98\x66\xa9\xa9\x4b\x79\x7d\xc4\x38\xa9\x7a\x7d\xc4\xba\x29\x8c\x11\x3e\x72\xbc\x2e\x01\x70\xa6\x7e\x1d\xe5\x00\x2e\xf5\x6f\xc7\xeb\xe6\x00\x04\xf9\x03\x65\xe3\x99\x93\x82\xc7\x31\xce\x49\xcb\xf3\x29\x9a\xa9\x5a\xe2\x40\xc6\xdf\x16\x19\x7d\x9f\xa2\x58\x65\x2c\xcd\x8c\x17\x2a\x63\x26\xda\x65\x64\xbc\xf4\x29\x5a\xc2\x04\xc5\xf5\x8c\x57\xbe\xec\x09\xcf\x98\x99\x19\xaf\x7d\xf1\xa7\xa7\xf2\x97\xbc\x0d\x3b\xcd\x72\xa8\xd9\xd1\xfe\xab\x57\x47\xb4\xe3\xbe\x02\x30\xa9\x27\x27\x22\x39\xab\x27\x67\x22\x59\x78\xd7\xb7\x3a\x54\xd8\x54\x25\xd2\xb2\xaa\x63\x01\xab\x9c\x80\xd4\x8c\xde\x29\x22\x0d\x2d\x93\x88\x26\xd3\xb3\x98\x92\x44\x3c\x88\x71\x00\xc4\x48\xae\x1d\x48\x91\x7e\x5f\xea\xea\x1f\x17\x32\x30\x72\x50\xbc\x95\x21\xe2\x65\x74\xc7\xc1\xf2\x09\xb5\xb4\x59\xda\x6e\xa9\x9b\x8f\xb3\x34\x16\x7e\x15\xa5\x8f\x12\x96\x2e\x34\xd4\x5d\x1d\xea\x36\x5d\x00\x23\x70\x49\x5e\xae\xe5\x36\x93\x78\xb7\x5b\xf5\xe3\xa4\x37\xe8\xf9\xea\x77\x59\x22\xde\x2b\x71\xa7\x4b\xdc\x19\x25\xee\xca\x12\x33\x79\xb9\xa5\xaf\xcf\x1c\x06\xba\xc4\x5d\xac\x4b\x80\x65\x05\x20\x56\x00\x9b\x12\x20\x32\xea\x6c\xb3\xc2\x5e\x9c\x19\x9b\x72\x6c\xe2\x10\x40\xfa\x66\x8f\x09\xc3\x54\xf3\x7b\x6d\xf8\xe9\x15\x5f\x06\x68\x25\x6b\x63\xdb\x6d\x47\xd5\xe5\xae\xc1\x76\xdb\x26\xb6\xad\xbf\x37\x80\xff\x57\xb6\x60\x61\xbe\xab\x2f\x1c\x6d\x14\xef\xd3\x3d\x48\xb6\xdb\x3e\x80\x7d\xaf\xfa\x76\x1d\xdf\xf3\x11\x39\x71\x7b\x3d\xcf\xb6\x45\xb5\x03\xe6\xb2\xf4\x62\xbd\x48\x13\x92\x30\x8a\x63\x07\x77\x3d\xe0\xf3\xc4\xcf\x19\x19\xd3\x5c\x46\xf9\x2b\x2b\x9e\x9a\xf4\xe8\xc4\xeb\x0d\xac\x9e\xd5\x61\xbe\x65\x75\x58\x09\x34\x29\x45\x2b\x29\x56\xf1\x52\x1d\xcb\xb7\x3a\x53\x87\x48\x66\xc4\xc7\xa1\x83\x64\x12\x06\x90\x02\x7d\x17\x6b\x59\x1d\x1a\xf0\x2c\xd7\xea\x38\x56\xaf\xd7\xb3\x3a\x19\x70\xf3\xe5\xbd\xb4\xa2\x71\x32\xad\x6f\xde\x15\x61\xe8\x8a\x7a\x47\xe6\xa8\x90\x01\x63\xfe\x7f\x40\x5a\x11\x4d\x12\x84\x2b\x62\x88\xb8\x09\xc1\xa5\xdc\x41\x01\x4c\x51\x41\xf6\xf9\x67\x2e\x3f\x25\xef\xa1\x40\x38\xb3\x31\x04\x09\x2a\x08\x95\x29\x38\x50\x41\xae\xf6\x04\x05\xca\xa5\x2f\xcb\xea\x24\x70\x8c\xa6\x4e\xd6\xf1\x00\x5c\xa0\xa9\x8c\xd9\xca\xc5\xea\xa3\xbc\xf3\xba\x77\x14\x77\x66\x1d\x3e\x3b\x47\x4b\xb8\x42\x51\xc7\x3a\xb6\x3a\x63\xf1\xef\x42\xcf\xe3\x88\x8b\x15\x1d\x64\xb5\xac\xce\xc4\x51\x37\x27\x00\xc0\x55\x39\x0a\xab\xbd\xb5\x51\xc8\xca\x0d\x32\x26\x3b\xc2\xe0\x18\x97\xa5\x37\xcd\x31\xec\xdb\xbd\x20\x0b\x8a\x0b\x6e\x98\x23\xc2\x47\x02\xce\x10\x85\x4b\x94\x88\x7b\x73\xce\x15\xd4\xda\x9e\x19\x2b\x7b\x26\x83\x5b\xb6\x11\x5a\x1a\xa9\x4b\x11\xed\xbc\x07\x97\x28\x2f\x2f\x4e\xe0\xec\xcd\x12\x68\xa9\x39\x50\xa5\x62\xa3\x54\xbc\xdd\x3a\x31\x52\xb7\x01\x51\x45\x96\x2f\x57\xa5\xb0\x78\x66\x45\xc4\x74\x2e\x7d\x0b\x23\xa3\xcb\x84\x39\xce\xac\xb3\x04\xc7\x7d\xe8\xf5\x00\x9c\xa2\x7c\xb8\x10\x57\x4b\x53\xe3\x4a\x5e\x38\xda\x99\xbe\x49\x85\x60\x1f\xbf\xe9\x09\xbb\xf3\x45\xd7\x83\x63\x27\x02\xb6\x9d\x0f\xa3\xf0\x24\x05\x25\x34\x43\x29\x24\x28\x87\x18\xc5\x50\x72\x21\x0e\xcc\x07\x0c\x8e\xd1\x02\x4d\x51\xa4\x82\x92\xed\xf4\xb5\x54\xdb\x99\x96\x18\xba\xc2\x03\x4e\x7c\xa2\xea\xe9\x98\xf5\xbc\x39\x5c\x0f\x07\x94\xbc\x66\xbf\x1e\x83\xe2\xae\x0b\xbe\x00\x31\xaf\x47\xb8\x3f\x64\x6e\x2e\x6f\xb4\xac\xae\x05\xb6\xdb\xae\xd7\x36\x92\x6e\xf7\x93\xfe\x6a\x01\x60\xdb\x0e\x46\x73\x87\x81\xf2\x01\x0d\x2e\x1a\x27\x50\x57\xcb\x74\x2d\x15\x02\x96\x33\xa4\x8c\x2c\x62\x3c\x26\x3c\x15\x5a\xc7\x16\xb4\xa6\x16\x08\xa4\xa7\x72\x03\x3e\x00\x04\x91\x3a\x2c\x08\x78\xb5\x44\x39\x92\xf8\x89\x37\x5e\xf9\x8b\x12\x98\x25\x59\x70\x7a\xf0\x25\x10\xbb\xa4\x48\x79\x09\xfb\xb5\x94\xd7\xb0\xcf\x59\x20\x47\x06\x7c\xd9\x17\xbd\x1b\xb0\xd1\xa7\xbd\xa7\x40\x67\xe9\x32\x8e\x92\x1f\x58\x4b\xac\xa1\x96\xd5\x61\x1d\xab\x85\xf3\x16\x6e\xf1\x93\x91\x05\xa0\xb1\x77\xe6\x66\xa0\xe4\x92\xea\x94\xb2\x65\x09\x7a\x5f\x18\x61\x94\x5e\xdc\x8b\x8d\x42\xaa\xb7\xbf\x04\xd4\xaf\x7b\x1d\x71\xcf\xcb\x86\x38\x14\x51\x65\x8d\x78\x00\x45\x05\x0f\xff\x84\x0a\xd4\x35\x23\xaf\x62\x20\x2a\xe3\x09\xfe\xa9\xb8\x60\x06\x83\xa2\x7a\x65\x7e\x07\xfc\x76\xc3\x75\x71\x2a\x2e\xae\x4b\xe3\xa0\xab\x34\x22\x03\xd6\xa2\x49\xce\xb8\x70\xa9\x52\xfc\x3d\x38\x66\xdb\xfb\x96\x8b\x6e\x92\x46\xe4\x76\xb3\x20\xb6\xbd\x6f\x55\x29\x32\xaf\xf0\x9c\xec\x64\x03\x6d\x7b\x0f\xa9\xe8\x89\xb3\x5f\xd7\x10\x87\xc5\xd8\xf0\x8f\xed\x56\x0e\xee\xe3\x0e\xc0\x07\xf1\x13\x0a\x94\xc0\x7f\x72\xcc\x4f\x0d\x31\x4c\x61\x56\x50\x46\x9d\x64\xbb\xb5\x74\x09\x69\x07\x65\x7e\x16\x9d\xa1\x8c\xcc\x41\xd9\xa8\xc6\xd1\xd0\x97\x94\x2f\x84\x00\xa1\xc7\xa6\x6c\xcf\xf5\x13\xf3\xc0\x2a\xb8\x9b\x5a\xa0\x56\x6d\x89\xee\x9c\xa3\x2b\x6d\x22\x45\x5c\xe8\xbd\xd7\xc7\xa7\x62\xb8\xc0\x40\x05\xc9\x3d\x97\x9f\x45\x08\xe1\xaa\x59\x42\x89\xfb\xa2\xb4\x2d\x29\x84\x53\x19\x68\x53\x89\xa6\x8e\xa5\x23\xbb\x95\x85\x3e\x0a\x53\xd0\x6c\xa3\xc6\x5c\x1d\x8d\x22\xb2\xa2\x63\x22\x5c\x48\x7f\xe1\x27\x20\x11\xc6\xfe\x81\xdc\x7f\xa3\xec\x2d\x1e\x7f\xa3\xc9\xf4\x86\xa5\x99\x01\xc0\x45\xca\x79\xfa\xdb\x13\x99\xf9\xe1\xbc\xf4\x70\xd6\xfd\x81\x1c\x2f\x30\x1f\x3a\xcb\xf7\xab\xe4\x18\xfb\xde\x6e\x8c\xf9\xb1\xa6\x24\x22\x9e\x41\xcb\x6f\x4b\xa1\x8a\xf0\x45\xd4\x83\x18\x61\x5e\x8d\x0a\x3d\x2a\xad\xae\x64\xac\x4d\x71\x62\x13\xaf\x15\x08\xf9\x66\x78\x6e\x10\x7e\x3f\x46\x88\xe8\x87\xec\x19\xde\x94\xce\x22\x74\xb0\xd2\x11\xa2\x32\x85\x24\xd1\xa8\x14\x2e\x8b\x8a\x48\x07\x2b\x03\xcf\x84\xac\xd9\x65\xb4\x1e\x21\xd2\xf5\xca\x14\x93\xcc\xdd\x94\x8d\x36\xe8\x62\xd9\x95\x12\xf2\x73\x4d\x66\x84\x19\xea\xc1\xb4\xd1\x43\x97\xb0\x01\x76\x32\x00\x3d\x4e\xc9\xcc\xb1\xa4\x2a\xae\x69\xce\x5b\x14\xb4\x8d\x73\x04\x78\xcc\xde\xf0\x51\x23\x4c\xaa\x08\xd4\x51\xa8\x66\x71\x4c\x9a\x3d\x82\xcd\x10\xe9\xa6\x41\x82\xb2\xea\x09\x6d\x76\xac\x1c\x2d\x2d\x51\xd6\x4d\x82\xac\xb3\x7c\x93\x6f\xb7\xd9\x1b\x94\x0f\x1c\xe6\xe4\x00\x52\x07\x00\x5f\xf8\x2d\x5b\xda\xb6\x68\x71\xec\x00\xb0\x03\x3b\x73\x88\xce\x4c\x71\x4d\xda\x00\x31\xe3\x91\x8e\x27\x1c\x35\x1a\x4f\x73\xf0\x90\x0d\x69\x18\xea\x70\x1b\x55\x2b\xa3\x62\x77\x4a\xab\x21\xe1\x3e\x78\xcf\xc8\xce\xb6\xdb\x98\x0d\x49\xd8\x10\xc3\xb8\x50\x4d\x65\x92\x2f\x08\xb7\x71\x35\x04\x19\xe0\xc9\x8d\xe6\xf5\x08\x65\xdb\x2d\x1e\x66\xa1\x6d\xb7\xb5\x09\x99\xe0\x41\x89\x43\x86\x99\x11\x35\xb9\x70\x5c\x6b\x49\x20\x59\xd2\xc2\x6b\xf9\x53\x0b\x9a\xbc\x50\xd1\xa4\x9c\x37\x29\xe5\x75\xa7\xf5\x26\xe5\x9c\x52\x3a\xe9\x30\x6f\xaa\x82\x77\x36\x6b\xea\x6c\x31\x05\x9f\xaa\x84\xad\x17\x90\x72\xc8\x89\xf1\x58\xcb\x1d\xcf\x70\x76\xca\xd4\x19\xc6\xfa\x1b\x27\xc6\x08\xeb\x15\x48\x3a\xde\x49\x49\x93\xad\xbf\x71\x62\x6a\x94\xe9\x78\x60\x60\xfd\x2d\xfb\x5b\x62\xf9\x58\x16\x4f\x9e\x2c\x9e\x35\x15\x4f\xfe\x96\x59\x3e\xde\x19\xd6\xcb\x65\x2f\xae\x0a\x8e\xaf\xf9\xf6\x76\xab\x7e\x69\x0b\xff\xb6\x67\x06\x24\x0a\xb0\x6d\x63\x4e\x7d\x02\x80\x11\x3f\xc2\x67\x24\x61\x9c\x1b\x17\x82\x11\x47\x52\x56\xf0\xae\x72\x74\x26\x27\xbd\x81\x77\x5c\x9c\x2f\x18\xec\x12\xe0\x1b\x9f\xc4\x58\xe3\xdf\x4a\xc6\x98\x30\x97\xac\xc9\x58\x19\xc4\xb6\x8b\xfd\x5b\xb8\x29\xc5\xa5\xb4\x2e\x9e\xa2\x73\x51\x9d\x9a\x69\x7d\x99\x96\x98\x69\x2f\x44\x5a\xc1\x57\x86\x2f\xc3\xc1\x63\xe6\x63\x38\xf5\x29\xbc\xf7\x13\x88\x7d\x01\xfc\x2e\x4e\x31\x07\x7f\x19\x82\x9d\x6f\x02\x18\x74\xf6\x4b\xd9\xd6\x6f\xaa\x95\x45\x23\xb5\x15\xea\x21\x16\x15\xd1\x15\x17\x59\xdd\x9c\x6d\x62\x22\xe8\xbf\x11\xf9\x13\x31\xa8\x73\xca\x60\xe5\xc8\x9a\xd1\x28\x22\x89\x05\x0b\x9c\xf7\x69\xb4\x71\xf1\x62\x41\x92\xe8\x6c\x46\xe3\xc8\x29\xdc\xb9\x29\x06\x27\x82\x80\xcb\x57\xfb\x22\xb4\xb3\x83\xc5\xb9\x0b\xd4\x2b\x0c\xea\x0c\x55\x60\x96\x6a\x47\x8d\x19\x7e\x73\x4c\x2a\x7c\xa9\x39\xaa\xc3\xb6\xdb\xe7\x18\x31\x90\x2d\x11\x7e\xc8\x1c\xab\x1f\x59\xa0\xce\xc0\xda\xde\xae\xd8\x8e\x45\x1d\x1f\xaa\x77\x20\xc6\xc4\xa8\x35\xa1\x1e\xe8\x17\xe7\x0b\x61\x65\x7e\xfc\x7f\x5b\x47\xff\x71\xec\x32\x92\x33\xc3\xd4\x58\xdb\xd8\xf1\xdc\x04\x27\x1c\x84\xd6\x61\xae\xf0\x95\xa2\x94\xd6\xd7\x04\xdf\xc7\xa4\xc5\x52\x25\xcd\xff\x20\xc4\xf9\x1f\xa4\x3c\xaf\xe4\xab\x3d\xe6\x8c\xcd\x48\x4b\x4a\x6f\xd1\xe2\x4c\x85\x26\xfc\x3c\xe0\x78\x1d\x87\xb3\x63\x00\x3a\x56\xcb\xf9\x41\x78\x0d\xf8\x01\xb4\xd2\x49\xeb\xec\xe6\x17\xd7\x02\xb0\x7a\xa0\x48\xe4\x93\xe6\x72\x38\xee\x2a\x4a\x0b\xc7\x52\x11\x58\x2d\xd3\x60\xbc\x20\x12\x0b\x23\x60\x02\x4c\x38\xf8\x7e\x58\x57\x71\x65\x45\x1c\xab\x1a\xdb\x55\xbc\x61\x23\xa5\x61\xde\x5b\x71\x3f\x44\x6a\x96\x7a\x74\xe2\x50\xe9\xb0\xc2\xb6\x1d\x43\x65\xf4\xa6\xa2\x48\xc8\xc0\x76\x6b\xea\x93\xcc\xbc\x6e\x02\xc0\x9e\x52\x29\x01\xbe\x65\x75\x56\x0e\x83\x09\x80\xe9\x76\x9b\x2b\x07\xe4\x70\xc6\xa5\x48\x61\x8c\x93\xda\xb6\x13\x23\x8f\xbc\x80\x33\x94\x31\x00\x73\xdb\x76\x52\xdb\xd6\x83\xf7\x80\xb9\x10\x7d\xa3\xdc\xbc\xdc\xa7\x6c\xd6\x2a\x7a\x22\xbc\xc1\x94\xdd\x70\x5b\x9f\xe9\xf8\x5b\x2b\x4d\x48\x5b\x3c\x7e\xf3\x7a\xfd\x97\x70\x86\x52\x06\x97\x28\x67\xa5\x6b\x8d\x08\x19\x7d\x80\x63\xf4\xce\x89\xe1\x4c\x6b\x97\xe0\x14\xcd\xca\x48\xf9\xd3\x37\xa8\x17\x4c\xbb\x5d\x38\x3e\x46\x31\xe7\x40\xd1\x1b\x34\x06\x8f\x14\xad\x1c\x76\x3c\x86\x09\xe8\xcc\x86\xd3\x50\x6a\x85\x77\x74\xe2\xa8\xfe\x4d\xd0\x8d\x54\x5a\xd5\xc7\x03\x00\x37\x5f\xc4\x94\x39\x16\xe1\x27\xdf\x3e\x42\x68\x52\x90\xfe\xc9\xd0\x0b\xdf\xa0\x17\xf2\xc7\x09\xea\xbf\x14\xe1\x67\xf8\xc7\x7f\xbe\x78\xd3\x1b\xac\x44\x38\xa4\xe3\x77\x7c\xb0\x65\x22\x80\x09\xf0\xe5\x54\x8b\x3c\xe0\xb2\xf4\x1d\x5d\x93\xc8\xe9\x03\x48\x3b\x68\x39\x34\x84\x16\x5e\xe4\xf8\x05\xe8\x8a\xb8\xfe\x7a\x83\x95\xab\xf1\xd7\x9a\xd7\x89\x3b\xd3\x5c\x1b\x9a\x9a\xc0\x5f\xaa\xdb\x18\x57\x6f\x1a\x13\x44\xa5\xfe\x2d\x43\x49\x45\xe3\xc6\x44\x88\xe7\x52\xe3\x26\x74\xff\x49\xa1\x71\x13\x4e\x38\x93\x52\xe3\xc6\xb8\xf4\x95\x98\x1a\x37\x06\xe0\x52\xa6\x68\x8d\x1b\x03\x30\xd2\x30\x86\xc6\x4d\xd1\xee\x37\xe8\xbd\x69\x7b\xa6\x6f\xbf\xd5\x8e\xb2\xac\x4e\xd6\x08\xa6\xcc\x06\xf4\xc6\x8b\xd9\x30\x0d\x3b\x96\xfd\xbf\xbd\xd7\xbd\x40\x95\xe9\x21\x24\x55\x77\x71\xe7\x75\xef\x68\xd6\x59\x4a\xd5\x5d\xb4\xdd\xee\x57\x7a\x7a\x59\xe2\x9a\x3a\x39\x28\x51\x09\xcc\x32\x6e\x60\xb5\x8c\x36\xd4\xd1\x91\x24\x2c\xab\x13\x05\x05\x8a\x25\xe8\x18\x2a\xd2\xb1\xa9\x22\x1d\xd7\x55\xa4\xe4\x4d\xad\x6f\xca\x7e\x65\x30\x71\xa4\xe5\x75\x0f\xf8\xfa\x67\x64\x4c\xf1\x5f\x2b\x0c\x5f\x68\x57\x2b\xb3\x0c\x7e\xf7\x13\x5b\x11\x65\xae\xb8\xf6\x12\xae\x68\xe5\x1d\x93\xfc\x4e\x20\x76\x67\xf9\xea\x36\xfd\xf2\xfe\x2d\xca\x20\xd6\x0e\x63\x51\x0a\xd5\x45\x04\xca\xd5\xaf\x3b\xa4\x3d\x90\x8a\x20\x33\x68\x56\x7e\xdd\x8d\xd0\x52\x84\x8c\xb8\xfe\x19\x45\xe2\xc7\x2f\x38\xa6\xd2\xcf\x06\x1a\x73\xac\x9c\xdb\xc8\x8b\x72\xb4\x80\xd8\xfd\x8d\x64\xe9\x02\x47\x68\xca\xab\x9f\xe7\x72\xd3\x8e\xd0\x44\x85\x8a\xd3\xdf\x23\xde\x7a\xce\x5d\x47\x68\x05\x71\xc5\x3a\x1c\x6d\x14\xac\xf4\xd7\x85\xd6\x65\xd1\xdb\x54\xae\x4a\x34\x87\x58\xbd\x6a\x43\xf7\xc5\xcf\x73\x42\x16\xe8\x41\x34\xf2\x94\x1f\xc7\x3e\xd2\x6f\x04\x9d\x8a\xef\x73\xe1\x78\xe2\x1b\x41\xd7\x7c\x94\xe2\x34\x21\xe8\x9c\xff\x12\xcc\xf8\x4c\xf0\x60\x74\x01\xb1\xc1\x84\xcb\x43\x26\xfa\x08\xb1\x7b\xc9\x48\x86\x59\x9a\xa1\xdb\xa2\x58\x91\x74\x23\x66\x62\x41\x30\x3b\x4d\xa2\xb3\x98\xe0\x64\xb9\x40\x9f\x45\xbd\x02\xcb\xd9\x0c\x27\x53\x9a\x4c\xe5\x4b\x94\x8f\x34\x67\xe8\x4c\xbc\x56\x67\x64\x2c\x22\x14\x9f\xeb\x70\xdc\xe8\x93\x28\xc5\xe5\xc6\x33\x15\xc0\x33\x7a\xbb\x41\x57\x7c\x9e\xd2\x07\xf4\x4e\xb8\xd4\xfe\xf2\xfe\xed\x08\x7d\x11\x80\xb2\xe5\x37\xf2\x51\x29\x89\xd0\xa5\x98\x50\x2d\x03\x8c\xd0\x07\x88\x1b\xe3\xcc\xa2\xbb\x22\x63\x3f\xac\x2c\xfa\x55\x0d\x78\x43\xd6\x2f\x2a\xab\x86\xee\xaf\x82\x8b\xbe\x3d\x14\x87\xfe\xfd\xbf\xed\xeb\x8d\xb7\x5c\xc2\x2c\xc2\x44\x21\x4f\x9e\x03\xff\x52\x3e\x1d\xe0\x92\x30\x76\x3f\x5e\x8d\x6e\x2f\xae\xd0\x5f\x44\xee\xd7\x26\x4d\x79\x51\x80\x81\xe3\xbf\xec\x02\x2c\x9d\xfc\xa0\xaf\xa2\xc4\x6f\x07\x4c\x56\xbe\xca\x6b\x94\xaf\x0e\x01\x32\x3e\xd9\x91\x93\x74\x69\xf5\x66\xa1\x10\x13\x14\x52\xe1\x56\x4a\xc7\x07\x44\xbf\x09\xfc\xff\x8d\x86\x7d\xd8\x0f\x03\xec\x9e\x5f\xdf\xde\x5e\x9c\x8f\x3e\x5e\x5e\x5d\xa0\xff\x16\x79\x3f\xa3\xe1\x8f\xf0\x85\xc8\x3b\xbd\xf9\xa0\xf3\x7e\x16\x79\x7f\xe7\x79\x7d\x58\x96\x1d\x71\x18\x09\xf1\xf7\x00\x1b\xe1\x5b\x90\x17\xe0\x22\xe2\x09\xea\x8b\xd2\x7f\x6e\xbc\x31\xd8\x97\x63\x03\x73\x5b\xa1\x3f\x8b\xb2\xff\xd5\x10\x61\x04\x47\x51\xf3\x05\x7e\x80\x8b\x3c\xf4\x5f\xa2\xf8\x7f\xa0\x47\x83\x0f\xfa\x87\xda\x51\x30\x4a\xb0\x83\x9a\x49\x1e\x04\x96\x2c\x54\x42\x72\x72\x71\x10\x50\xf0\x56\x09\x27\xf8\xea\x41\x40\xc9\x75\x55\xdd\x92\xe3\x1e\xae\x5d\x71\x64\x09\xad\xb8\xf1\x41\x68\xcd\xad\x35\xee\x92\x53\x3f\x51\x81\xc1\xce\x75\x2f\x37\x4f\x74\x72\xc3\xa1\xb4\x91\x87\xdf\xf4\x4a\x01\xa6\x0d\x1a\xfa\x4a\xb6\x08\x2f\xbd\x6f\x0f\x85\xfe\x43\xcc\x22\x63\xdf\x37\x8d\x5f\x6f\xcf\x7e\xd7\x4c\x7e\xbd\x3d\xfb\xee\xc9\xfc\x7a\x7b\xf6\xdd\xf3\xf9\xf5\xf6\xec\xf7\x4c\x29\x6f\xc6\xef\x9a\xd5\xaf\xb7\x67\x7f\x60\x62\x45\x35\xbf\x6b\x6e\x45\x9f\xff\xd8\xf4\x0a\x83\x9f\xaf\xb7\x67\x35\xb8\x86\x89\xfe\x7a\x7b\x86\x18\x83\xb7\xe6\x5b\x50\xbe\xff\x0d\x2d\x61\xf1\x84\x55\x69\x5a\x2b\x07\xd1\x9a\x87\xb2\x05\x21\xdf\xb4\x0f\x32\xad\x2a\xed\x78\x10\xa3\xb6\x17\x90\x93\x42\xc5\x1a\x18\x58\x4b\x25\xec\x76\x5b\x4b\x70\x0c\x9d\x2d\x24\x40\xfb\xd4\x25\xe4\x1b\x32\x72\x86\x24\xe4\x15\xf4\xd4\x59\x84\x74\x3a\x3b\xf3\xc9\x66\xa9\xb1\x85\x78\xbb\x75\xaa\x3a\x63\xaf\xa6\x33\x06\x90\x49\x23\x4d\xc2\x1a\x9e\x80\x2a\x65\x44\x46\xfe\xbe\x24\x39\x3b\x4d\xe8\x5c\x98\x1b\xbd\xcb\xf0\x9c\x14\x66\x4a\x52\xed\xfe\xe5\x49\x98\x79\xfa\xdb\xd3\x00\xe9\x33\xe5\xf3\x03\xf9\xe6\x5a\x52\xb0\xb9\xd4\xe9\xa6\x4b\xe6\x30\xe8\x91\x17\xc7\xaf\x7b\x60\xb7\x73\x38\xbf\x34\x3a\x22\xca\x23\x22\x59\x3b\x66\xe8\xb1\x74\x5b\x24\xdc\x72\x2b\x2f\x62\x7e\xbb\x07\xcb\x9c\xf3\xfb\xf8\x70\xa6\x74\xeb\xbd\x64\x4f\x64\xae\x48\x66\xe6\x72\x39\x86\x26\x44\x28\x72\xcc\x04\x19\xae\xbf\xdd\x83\x95\x48\x7d\x3a\x9a\x7e\xfd\xbb\x78\xcc\x2d\x84\xdf\x7a\xae\xf4\x47\x54\xf9\xaa\x83\xc8\xf0\xfc\x3d\x38\xa1\x71\x7c\x1a\x2f\x66\x98\x7f\x4c\x33\x1a\x55\x1a\xa7\x13\x8a\xc6\xcd\x68\x24\x7a\x14\xe3\xcd\x75\xd1\x79\x99\xa1\xc3\xe9\x19\x15\x35\xc4\xd8\xe3\xc9\xb4\xe6\xf0\x9c\xa7\xc9\xd3\xc7\x39\x5d\x95\x1f\x3f\x7f\x7a\x6b\x7e\xbc\xef\x97\x5f\xda\xc7\x1e\x6f\x5b\x6e\x24\xcf\xd2\x87\xbf\x92\x2c\x95\x51\x44\x45\x3a\x99\x92\x44\x74\xb4\x16\xcd\x58\x24\x69\x8b\xe0\x3b\x21\x59\x16\x61\xfc\xce\xea\x33\x20\x52\x75\xeb\x85\x03\x48\x19\x1a\x3e\xcd\x3e\xc7\x29\x7b\x47\xe3\xb8\x18\xb1\xc6\xdc\xf7\x19\x8e\x28\x49\xd8\x61\xa8\x1b\x96\xa5\xdf\x48\x73\xfe\xdb\x42\xfb\xf7\x7d\x50\x95\x09\xdb\xab\xe9\x70\xee\xbb\x34\x23\xcf\xd7\x53\x42\x1d\xc6\x54\x2c\xa8\x7c\x96\x3e\x88\xb1\xcd\xaf\x93\x62\xc9\xea\x8c\x2f\x69\xac\x36\x45\x2e\xea\x2b\x70\x2d\x93\x48\xac\x30\x73\x0a\x96\x49\xe3\x0a\x33\x83\xd1\xf0\x83\x28\xa4\x0c\x3d\x9e\x5f\xbc\x3b\xfd\xfa\xf1\xf6\x20\x23\xc1\xee\x3d\x99\xd2\xe4\x33\xe6\x6c\x59\x1c\x46\xe3\x58\x28\x5c\xc5\xd1\x14\x67\x63\x87\x83\xa6\xb0\x07\xfb\x47\x2a\xe4\x18\x97\xfd\x14\xa4\x23\x19\x8c\x5c\xd2\x39\xa2\x92\x9a\x24\x0c\x1d\xff\xdf\x6c\x7a\x8f\x07\x7f\x73\x9c\xbf\x45\x8f\x1e\x7c\xb1\x03\xf0\x6f\xf9\x51\xf3\x87\x33\xf0\xc5\xf7\xb0\xe7\x85\xce\xc0\xff\x9b\xfb\xb7\xa8\x03\x06\x00\x0c\xfe\x06\xfe\xe3\x18\x66\x0c\x0d\xad\x9f\x2d\x68\x7d\xb2\xa0\xf5\xd6\x82\xd6\xad\x05\xad\x3f\x5b\x21\x4c\x79\xc6\x37\x95\xf1\x5e\x65\x7c\xb6\xa0\x75\x61\x41\xeb\xaf\x16\xb4\xee\xac\x10\xe6\x1c\x68\x6e\x41\x6b\x69\x41\x2b\xb1\xa0\xb5\xb0\xa0\x35\xb1\xa0\x85\x2d\x68\xfd\x66\x41\x6b\x63\x85\x30\xe6\x40\xff\x85\x79\xf6\x3b\x72\xcf\x31\xe2\xcc\x82\xd6\xe9\x22\x13\xbf\x37\x16\xb4\xfe\x6b\x99\x88\x7f\x63\x9e\xbe\x9c\x5a\xd0\xba\x21\x1c\xd5\xf5\x98\x59\xd0\xba\x4a\x57\x16\xb4\xce\xc9\xd8\x0a\xab\xf6\xb3\xfa\xa8\xe5\x7b\xaf\x77\x21\xf4\x7e\xfa\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\x0f\xfa\x79\xab\xba\x96\x2d\x03\xd0\x18\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\x47\xb1\xbc\x4d\xd3\x98\xe0\xe4\x1f\x45\x53\x8d\x34\xfe\xc7\xf1\x54\x62\x01\x3d\x33\xbc\x0d\x91\xdd\xf7\x71\x2a\xf6\xfd\x0b\x25\x0f\x0a\x68\x74\xc0\x23\x75\x50\x57\xc4\x14\xf6\x15\xc4\x14\xcc\xc4\x36\x2c\xfc\xda\xda\x36\x1d\xb2\x50\xfe\xbb\xff\x5e\x4b\xf8\xb8\x1d\xe2\xd0\x57\xee\x89\x59\xcd\x3d\xb1\xd0\x5f\x96\x86\xac\x66\x35\x43\x1c\x0e\xea\x09\xbe\x43\x55\x50\x7b\xd5\x0c\xf8\xbd\xf5\x8b\x7d\xcd\x6c\x5b\xc7\xc7\xef\x35\x01\x97\x99\xb2\x48\xbf\x5a\xc6\x7b\xaa\x8c\x27\xca\xa8\xfd\xe7\x60\x20\x82\x68\x99\xf3\x50\x1e\x89\x0e\xb9\xae\x35\x8e\x50\xd5\xa2\x65\xb0\xba\x43\x45\x0d\x22\x3a\xa8\x27\xf8\xa5\xc3\xe9\x8b\x35\xcb\xc8\x5c\xde\xa3\xef\x55\xa0\x33\x0f\x7b\xbc\xaf\xec\x5b\xc7\x5a\x8b\x26\x7d\xc6\x91\x05\x8e\x15\xeb\x10\x67\xe8\x91\x88\x46\xe9\x3e\x68\x73\x44\x79\xc9\xbb\x9c\x7f\x49\x1f\x72\x47\x8b\x1c\xc3\x5e\x97\x41\xaf\xc3\x8a\x68\x7a\x62\x04\xf0\xc3\x39\x66\x58\xcc\x80\x50\x36\x57\x53\x2b\x5f\x05\xdb\x0d\x95\x42\x9a\x15\x56\x9f\x5d\x12\x90\x2e\xa2\x47\x0c\xe2\x0e\xff\xa3\xd8\xd3\x90\x40\x1c\x56\x3b\xbe\xf9\x9e\x8e\x63\x36\x23\x99\x8e\xee\xa2\xae\xbc\xf9\x5c\x91\x48\xb9\x91\x96\x96\xee\x90\x20\xe6\x12\x85\x0b\x9a\x2c\x4b\xca\xb6\x2a\xa8\xdd\x5d\x31\x99\xf9\xc8\xa9\x0a\x1b\x12\xb8\xb2\xcb\x45\xd0\x00\x2c\x82\xe3\x35\x71\xbd\x56\x51\xa3\x62\x7b\x0d\xdd\xab\x2d\x1c\x66\xbc\xbf\x44\xd2\xa6\x9a\x21\x7e\x38\x3b\xe9\x6d\xb7\xec\x8d\xc9\x69\x95\xc5\x66\xfd\x31\x04\x31\x60\xb8\x40\xa4\x47\xf7\x40\x60\x3f\xd2\x1c\xce\x2f\x3c\xd4\xd4\xfc\x09\xef\x4b\x85\x14\x63\x36\x50\x88\x30\xca\xb1\x92\x76\x22\xad\x83\x3b\x12\x60\xbc\x89\xac\x31\xe1\xf3\x74\x2e\x02\x33\xe5\x07\xa2\xdb\xc9\xf5\x26\xe0\x54\xe8\x2a\x7d\xbe\x14\x69\x2a\xaa\x13\x2f\x10\x36\xa0\x96\x45\xea\xe3\x5e\x7b\xfb\xb2\x37\xa8\x95\x2d\xa4\x17\x51\x25\x58\x65\x71\xc5\xb3\xee\x38\xac\x8b\x87\xbd\x10\x1c\x3b\x78\xe8\x85\xf2\xf7\x11\x71\x1f\x1a\x5a\x73\x57\x6f\x4d\x79\xa3\xa0\x7a\x54\x8d\x55\xc5\xf3\x0d\x99\x09\xef\xb5\x97\x36\xb4\xb7\x74\x76\xbe\xe9\xe0\x23\xea\xce\xf6\x1a\x82\x19\xfe\xbe\x21\xc7\x0c\xef\x8f\x39\x66\xf8\xc9\x41\x2f\x0a\xfd\xf3\x47\xbd\x08\x73\xd5\xcc\x76\x6b\x31\xfb\x34\x25\x12\x11\x0f\xd7\xe0\x98\xb8\x0f\x85\x07\x9f\x3d\xdb\x43\x07\x0b\x5a\x27\x22\x5c\x16\xd6\xd1\x3c\xad\x63\x14\x3f\x32\xa6\xb8\xa9\xdf\x8d\xf3\xfb\x54\xcf\x71\x53\xcf\xcb\xb0\x9d\xe5\xfe\x09\x4c\x6a\x21\x03\x24\xf4\x00\xfc\xce\xc1\x20\x40\xdf\xcf\xf1\xb5\xea\x6e\xc0\x31\x76\x67\x4f\x0c\x05\x15\xa3\xc0\xc7\xa3\xf4\x90\x46\xc5\x50\x60\xbe\xa6\xdc\x59\x97\x09\x14\x47\x02\xb2\x4b\x9b\x86\xa3\xb2\x90\xbf\x77\x44\xea\x1d\x0c\x54\x2c\x89\x03\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\x23\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\x40\x93\x94\x55\x15\x24\x1a\x54\xb2\x75\xc9\xa5\x3c\xf9\x1f\x96\x5a\x74\x1e\x4b\x17\x85\x49\x00\x4b\x17\x45\x3a\x97\xb2\x8a\x0c\xfe\x01\xff\x57\xc3\xde\x83\x8d\xbb\xac\x40\x72\x60\xaf\x92\xe7\x36\x28\x69\x1a\x86\x7d\x81\xe2\x90\x34\xad\xf6\x65\x15\x49\x4e\xa4\x61\x7a\x3e\x3a\xac\xb6\x94\x46\xdc\x8e\x54\xd0\x95\x9b\x52\xea\xe4\x64\x59\x7d\xb7\x2f\xbf\x3f\xe1\x45\x25\xd4\x26\x3e\xc4\x36\x04\xf8\x0d\x66\xcb\x4c\xdc\xe0\x59\x60\xbb\xf5\xf4\x99\xf1\x00\xb4\x90\xf1\x39\xa0\xfb\x4a\x7b\x5c\x55\x91\x7a\xfa\xfc\x5c\x58\xbf\xe0\x97\x0d\x12\x7e\x12\x44\x56\xe9\xa4\xc3\xd1\x41\x7a\x88\x88\xab\x43\x27\xd2\xd5\x8c\xf4\x61\x80\xd8\x30\xef\x78\x21\x9c\xa1\xa7\xaf\x7c\x24\x7e\x0b\xc6\xf2\xb0\x37\xe3\x68\x32\x30\x43\xd9\x30\xff\x4f\xed\xd4\x32\x2c\x5d\xe4\x2e\x51\xfe\x9f\xfd\x41\xd2\x71\xf2\x8e\x07\x8e\xfb\x7e\xd9\x7c\x95\x02\x60\x84\xbc\xa3\xe5\xb1\xe3\x75\x08\x08\x66\x68\x5d\xbc\x9c\x76\x22\xe9\x5b\xc9\x1c\x76\xa9\xb2\x9b\x81\xfa\xd8\x0f\xe3\x10\xcd\x76\x7b\xc7\x23\x39\xd1\x07\x97\x87\xc4\xb9\x7f\x3d\x2a\x95\xf5\x32\xf6\x5c\x43\x10\xbc\xf2\x8a\xb4\xeb\x41\xbc\xbf\x68\xa4\xc9\x31\x36\x4d\x8e\xe9\xc4\xc1\x43\x1a\x8a\xe8\x8a\x04\xd1\xc0\xbc\xb1\xed\x7a\x08\x11\x79\xdc\x7a\x4c\xf0\x9c\xf8\x0c\x8e\xc5\x09\xd5\x27\x50\x4c\x5e\xac\xa2\x7a\x9a\x33\x39\x24\x5d\x2f\x84\xa2\x07\x7e\x7d\x2c\x58\x28\x9e\xd9\xf8\x5e\x67\x6f\x2a\x2b\x91\xfd\xb8\xcc\xd9\xb4\xc1\xbe\xa4\x71\xfc\xdc\x89\x4e\x3f\x08\x13\x5a\xed\x6c\x14\x90\x42\x2e\x94\x09\x88\x1c\x3c\xdc\xd1\x64\x21\x8c\x5f\x89\xcb\xeb\x44\x16\x17\x20\x4a\x5a\x10\xd1\x7c\x11\xe3\x0d\xb2\x92\x34\x11\xe4\x69\x1c\xe3\x5c\x04\xf0\x43\x96\xb6\x2b\x94\x75\x58\x4f\x9c\x52\x08\x00\x41\x75\x1f\x56\x2e\xed\x1c\xab\x7c\x91\x61\x81\x81\x75\x1f\xa7\xe3\x6f\x96\xaf\xea\x2c\xb7\xe3\x69\x46\xb0\x03\x60\x82\x1e\x59\xba\xf0\xa9\xbb\xe9\x50\x77\xd6\xed\xbf\x92\xd4\x89\x53\x43\x9f\xba\xeb\x8e\x27\xbf\x55\xd3\x7d\xbc\x0b\x88\xcb\x39\x14\xb2\xfa\xbc\x07\xe2\x92\x19\xd5\x2f\x6c\x4a\x3b\x26\xd5\x75\x98\xf0\x31\x49\x93\xf1\xec\xd0\xbd\x8d\x8b\xa3\xff\x5e\xe6\x8c\xb7\xdb\x51\x68\x9b\x67\xb0\x6a\x0c\xb2\x3f\x83\x8f\xf2\x92\x9d\x26\x53\xbf\xed\x41\x9a\x7f\xc6\x49\x52\x7c\xf4\xcf\x3f\xe3\x44\x98\x6f\x64\x78\x7a\xc3\x70\xc6\x7e\x15\x21\x55\xcb\xef\xbb\xf2\xfb\x22\x89\x7e\xad\x7c\x19\x79\xe7\x34\x23\xf2\xf5\xd1\xff\x47\xde\xbb\x7f\x37\x6e\x23\x09\xa3\xbf\x7f\x7f\x85\xcc\xbd\xcb\x26\x9a\x10\x2d\xaa\x93\xcc\x84\x34\xec\xe3\xf4\x23\xc9\x4e\x3f\xd2\x8f\x64\x3a\xd1\xea\xea\xc0\x22\x24\x71\x43\x91\x1a\x92\x7a\xc5\xd6\xff\x7e\x0f\x0a\x00\x09\xf0\x61\xbb\x33\x3b\xf7\xfb\xf6\xde\x93\x93\xb6\x08\x02\x20\x50\x28\x14\xaa\x0a\xf5\x80\xa2\x4d\xce\x76\x75\x75\xf9\xf4\x6b\xfd\xf4\xa2\xdd\x44\x58\x76\xbc\x65\x87\xf2\xc5\x4d\x02\x9e\x62\x30\x44\x61\x27\xf9\x9a\x2d\xca\x75\x56\x08\x27\x53\xa8\x7e\xf8\x39\x8d\xcb\xe2\x27\x96\x03\x3f\x2a\x07\xc2\x11\x9a\x03\x54\x7e\xe8\x10\x8c\xf0\xe6\x18\x8c\x30\x58\x7c\xb1\x88\xb7\x2e\xc4\x3b\x59\x22\xdd\xa9\x84\x51\x20\xcd\x37\x60\xee\xf4\x4e\xc9\xa7\xea\xeb\xf1\x1f\xe2\x20\x7a\x91\xed\xd3\xa0\xed\x51\x6d\x5a\xaa\x5c\xb5\x03\x95\x07\x4e\x2b\x16\x79\x2b\x74\xb9\xba\xea\x39\xa8\x00\x12\x0e\xab\x44\xef\x90\x7a\x9b\x03\x89\xbd\x03\xa6\xde\xe6\x48\x62\xef\x28\x23\x47\x88\x15\x23\x87\x3a\xa8\x04\x78\x7d\xe8\x6f\x7f\xad\xdf\xfe\x5a\xbd\x6d\xc3\x9a\x8f\x89\x72\x01\x79\xe3\xcd\xb3\x1d\x03\x0f\x60\xc9\x59\x06\x9d\x44\x01\x62\xb3\x96\x5e\x85\x5c\x5c\x68\xae\x90\x0b\x42\x7d\xd6\xef\xc4\x84\xb5\x01\x0b\x78\xeb\x83\x94\xce\x9b\x5a\x17\xb7\xda\x43\xdd\xc1\x32\x4e\x97\x7c\x19\xab\x2e\xd4\x92\x13\xc3\x9d\x55\xdc\x05\xd1\xf6\x45\x50\xc4\x12\x56\xb2\x81\x7c\x33\x61\xd3\xaa\x57\x58\x1a\xdc\xfd\xbe\xbe\x9a\x3a\x95\x02\x48\xdb\x54\x81\xe9\x84\x59\xeb\x5c\x6e\xba\x01\x5a\x48\x9e\x1d\xb5\xf5\x5e\x4f\x10\xd3\x58\xe5\xae\x7d\xb4\x6c\x1f\xd7\x11\x01\x6b\x85\xa0\xee\x86\xc4\x9c\x18\x53\xcc\xe9\xbf\xc3\x26\xf1\x14\xc9\x28\x66\xde\x3e\x4e\x92\x17\x62\x89\xa5\x68\xf7\xe6\x58\xb0\x64\xa1\x94\xd2\x7a\xb7\xa5\x26\x66\x84\xdd\xe3\x53\x47\x80\x94\x06\xb6\x1b\x0b\xa7\x4d\x8a\x15\xe5\x74\xcf\x71\xe2\x03\x9b\x97\x33\xd2\xed\xc4\x86\x8b\x8a\x4b\x69\xc8\x5b\x61\x4e\xc8\x41\x8b\x96\x70\x95\x78\xf3\x84\xd1\x1c\x82\xc5\x57\x41\x1f\x19\xce\x4c\x9d\x93\xb0\x82\xca\x24\x81\xf7\x8e\x58\x4b\xbd\x78\x7f\xd5\x15\x0a\xe0\x93\x2a\x22\x83\x6d\xeb\x5f\xbc\xa7\xe1\x01\x57\xc3\x89\x71\x71\xef\x37\xf6\xf5\x70\xe2\x61\x81\x10\x2e\x1b\x93\xa4\xb6\xcd\x6c\xdb\x49\x34\x5f\x3e\x2b\x5f\xde\x50\xc7\x1f\xff\x15\xab\xff\x47\xde\xb3\x67\xc8\xc2\xa2\x52\x13\x1e\xf4\xb1\xf0\xa0\x43\xf6\x00\x3c\x50\x50\x9a\x00\x49\x6d\x3b\xfe\x13\xa3\x7b\x2c\xec\xd2\xc7\xc2\x2e\x1d\xc6\xa8\xa9\x46\x82\xa5\xea\x40\x37\x25\xc9\x6f\xf3\x9c\xa5\xa5\xaa\x70\x9d\x2f\x8b\x99\x16\x78\x54\x17\xf4\xeb\x45\x1f\xe1\x91\x6e\x18\x6d\x98\x3f\x37\x35\x08\x19\xef\xfa\x73\xd3\xdc\xea\xfe\x6f\x87\xc6\xad\xab\x79\xd1\x19\x77\x14\x33\xa9\x73\x91\x1f\x83\x13\x6e\xe6\x00\x2f\xdd\x35\x18\xf1\xbe\xf7\xa2\x57\x7d\x42\xbf\xe7\xc1\x29\x99\x94\x98\x4d\x35\xf1\xc3\xb4\x66\x72\x2c\xdd\x55\xd5\xaa\x06\x24\x7c\xdb\x59\xc4\x3f\x0c\x6e\xa7\x00\x5b\x43\x80\xe7\xfc\x8e\x6d\xe7\xc2\xe6\x91\x62\xa0\x03\xfa\x5d\xbf\x08\x3d\xda\x31\x91\x5f\xfb\xe7\x10\x3e\x00\xe0\xda\x7e\xba\x71\x79\x57\x88\xb9\x4e\x65\xf6\xa4\xb6\x21\x41\xae\x6c\x21\x33\xd2\xbe\x73\x2e\x71\x0e\xbe\x5f\x1d\x97\xd1\x39\x0a\x53\x21\xcc\x4c\x12\x9c\x4d\xd1\x49\x64\x92\xfc\x27\xa0\x59\x43\x92\xc3\xd5\xb4\xab\x5d\xa9\x53\x9a\x9a\xcb\xc8\x48\xe1\x94\x78\xcc\xd1\x08\x0c\x2f\x52\xc2\x26\xfe\x34\x5c\x29\xe0\xf3\x9e\x5a\xc0\x17\xd0\xe7\x23\xaa\x23\x15\xc8\xaf\x75\xde\x44\x39\xfe\xb0\x0e\xa7\xe3\x7d\x8d\x87\x70\x5d\xd9\x2c\x64\x1d\x0a\x5f\x06\x6b\x75\xbf\x00\xa2\xcc\x45\x1d\xeb\x50\x9d\xa8\x5a\xe1\xd1\x82\xc9\x49\x5b\x4d\x81\x06\x7c\xe3\x0a\xdf\x6d\x91\x57\xa6\xca\xef\xd0\x65\xf6\x84\x73\x52\x38\x29\x87\x51\x46\x72\x0e\xa3\x84\xe4\x93\x5a\x4e\x6e\x4b\x16\x54\x5b\x14\x2e\x86\x6f\x1f\xbb\xa8\x42\x9c\xee\xb1\xd1\xd2\x88\x90\xc0\xbf\x45\x96\xbf\xa4\xf3\x95\x61\xe1\xa3\xdb\xb3\xda\xb6\x64\x5b\x4c\x23\x57\xe9\xc0\x00\x21\x11\xe8\x66\x35\x73\x10\xa4\x3d\x77\xb6\xb6\xbd\xd5\x62\xe4\x65\x58\x7e\xcc\x5c\x7b\x99\xb1\x40\x0c\x66\x2e\xfe\x6c\xc4\x9f\xa5\xd8\x49\x0c\x12\x00\xb4\x09\xc6\x9c\x4c\x32\x9c\x4c\x11\xa6\xb6\xed\x6c\xba\xb6\xd9\x52\x2b\xac\xc1\xaf\x06\x6c\xe2\x7a\x84\xe7\x78\x83\x97\x3a\x96\x97\x1d\xd0\xfa\x27\x41\xa5\xc1\x44\x00\xa4\x4d\x86\x9a\x74\x48\x1f\x65\x07\x2f\x53\xf9\x57\xe0\x42\x20\x71\xf2\x48\x2c\xba\x6a\x39\xac\x05\xbe\x16\x75\xb2\xf6\x62\x2e\x1b\xc1\xf1\x73\xe2\x87\xf9\x05\x49\x80\x50\x65\xa4\x67\xdf\x3a\x39\x4e\x10\x5e\x4d\xf2\xa1\x3f\x25\x93\x72\x32\x9a\x3e\x75\xfc\x61\x86\xdc\xec\x29\xd0\x85\x72\xe2\xeb\x25\xfe\x54\xff\x24\xad\x3e\x19\xb7\x3f\x79\x7b\xff\x37\xb5\x28\x96\x93\x29\x9e\x93\x51\x38\xef\x20\xb2\x73\xce\xa4\x4b\x6a\x49\x27\xf3\xa9\x3e\xbe\x58\x3c\x63\x28\xf7\x1b\xe5\xfe\x74\x8a\xc2\xad\x98\x56\x74\x3a\xb4\x42\xc5\x39\x0d\x6b\x87\xad\x32\x60\x33\x65\x86\x0e\xe3\x31\x79\xb8\x6c\xc5\x9d\x78\x58\xd4\xb2\x41\x8d\x42\x64\x52\xd9\xe9\x4c\x4f\xab\x3a\x17\xb7\xb9\xb1\x57\x93\x72\x8a\xb0\xb9\x27\x4f\x38\xe9\xf4\x46\x3c\x4f\x38\xff\xdc\xd4\x57\x71\xce\xa7\x4f\xc7\x65\x58\xeb\x98\x2d\x41\x1e\xfd\xd4\x69\xd3\x26\xdc\x12\xbd\x0c\x12\x21\x7d\xb6\x6d\xf5\x53\xc5\x7e\x9c\x54\xef\x70\xf5\x4a\x99\x65\xd6\xc2\x6a\x8f\x74\xa2\xd4\xd2\x93\x83\x88\x85\x28\x72\x17\x1d\xb0\x78\xfc\x55\x3c\x1e\x1b\x76\x06\xbc\xcf\xe7\x49\x56\xb0\xa2\xfc\x90\xed\x7b\xd4\x71\xfe\xf9\x08\x53\x32\xac\x14\xaa\x8a\x43\x84\x80\x26\x45\x97\xbf\x53\x9d\x19\x26\x9e\xa4\x53\x4e\xe2\x55\x78\x78\x99\xa1\x1f\x34\xa5\x52\xf6\xc8\x27\x05\xe0\xfd\xc1\x08\xc5\xe8\x24\xf8\x6c\x24\xad\x58\x56\x75\x2c\xd6\x44\x32\x8b\x87\x61\x89\xc2\xd5\x85\xb0\x12\x5a\x61\x4a\x12\x2f\x8e\x0e\x48\x73\x66\xef\x9b\xa7\x08\xf4\x68\x9e\xa8\x95\x7e\xb9\x96\x8c\x70\x82\x57\x30\xf3\x6d\xd7\xa4\x6b\xed\xf5\xf6\x92\x8c\xc2\xe1\x70\x8b\xea\x2d\xd7\x51\x7f\xb2\x55\xdb\x30\x52\x70\x72\xdd\x39\xca\x49\x34\x99\x4f\x71\x63\xe6\x39\x82\x98\xae\x79\x3d\x55\x9c\x56\x4f\xc7\x21\xc3\x0e\x25\xf1\xd3\xd8\x4d\x9f\xa6\xe8\x82\x63\xfe\x8a\x50\x0e\x63\x5c\x90\x2d\xf8\x81\x71\x48\x28\x74\xb8\xcd\xb3\x7d\x90\x60\x11\x48\xfd\x2d\xe8\x41\xf5\xe1\x15\xac\xe4\x85\xc5\xa4\x98\x8a\x00\x35\x41\x76\x6a\x83\xee\xa3\x70\x27\x7c\x10\x74\x44\xba\xa3\xea\x48\xc5\xd9\x69\x8d\xcd\xeb\x84\x63\xe8\xba\xb9\xc1\xef\x2d\x59\xf9\x9a\x2d\x44\xa6\x32\x9a\x1f\x67\x4e\x0e\x81\x60\x21\x05\x5c\x17\x78\x73\xc0\xa0\x33\xa7\xb8\x24\x89\x22\x36\x0a\x77\x92\x6e\xfc\x52\x15\xb6\x64\xa5\x40\x0b\xbc\xcc\xa5\x7a\x3c\xd8\x76\xe1\xfa\x17\x55\x7f\xd2\x1d\x2d\x01\x85\x7e\x47\x87\x11\x52\xb1\x58\xa3\x6a\xe5\xaa\xbe\x78\xfd\xf9\xe5\x48\xd4\xd8\x10\xa7\xac\x5f\xa1\xf3\x79\xb8\x75\xc9\xe6\xa9\x13\x55\x6b\x5c\x0d\x09\x9d\x4e\x55\xa8\xfa\xf2\x42\x1f\x9a\xea\x6c\xc9\x47\x34\xec\x1c\xd1\xb2\x1a\x51\xd5\x70\xb8\xec\x1b\xd1\x4a\xdb\x59\xd5\x88\x96\xdd\x23\x02\x6b\xf2\xfc\xee\x6e\x7b\x21\xc2\x56\x90\x15\x8e\x49\xce\xdf\x68\x48\x97\x3e\x8c\x74\xb1\x42\x3a\xda\x40\xba\xda\xee\xa4\xc7\x45\xa2\x81\x00\x61\x5f\x26\x1b\xdd\xb4\xb6\x49\x99\x85\xa0\x47\x05\x87\x0e\x66\x9f\xed\x6b\x9f\xae\x3c\x06\x9c\x67\x3d\x83\xcc\x4c\xb9\x6d\x9f\x49\xce\x58\xbc\x7f\x9d\xf1\x7d\xe2\x48\xb8\x17\x61\xd1\xab\x28\xd7\x1c\x74\x2d\x74\x55\xed\x1b\x7d\xa7\x81\x50\x1e\x34\xb7\x54\xfd\x4a\x5d\x45\x15\xac\xac\xf9\xee\xc2\xcb\xb3\x3d\x2e\xbc\x1a\xf6\xc2\x9c\x4f\x57\xf4\x34\x36\x68\x8c\xc2\xae\x9e\x92\x87\xa4\xa7\x56\x2c\x25\x0b\x85\x2b\xdb\xce\x6c\x7b\x65\xc4\x85\x96\xeb\x55\x94\x87\x99\x72\x00\x4e\x44\x70\xb1\x59\xfd\xee\x43\xb6\x57\x22\x7e\x0d\x72\x2e\xe8\xb7\xce\x65\x83\x30\xb4\x4e\xd7\xa6\xd7\x31\x67\x03\xf4\x93\xbb\xf1\x6e\x32\x9a\x86\x1d\xbe\x79\x7a\x2d\x9d\x3f\xd1\xd1\xac\xdd\x1d\xbb\xe7\x53\x0c\x3e\x25\x5f\x37\x2c\x0e\x25\x57\x5a\x81\xbe\x81\xf4\x95\x87\x00\xac\x1d\x8d\xd8\x6b\xb6\x63\x89\x6d\x3b\x66\x01\x19\x09\xa1\xa3\xae\x2b\xfb\xfd\x31\x52\x75\xab\x02\x65\x58\xcb\x1a\x9d\x72\x49\xef\x62\x74\xc5\x02\x7f\x34\x64\x32\x2f\xec\x48\x4f\xa2\xe2\x34\x07\x21\xbc\xc5\xe1\xc6\xa5\x1e\xbf\xe3\x23\xa5\x64\x77\x5d\xf3\xcb\xf2\x90\xc0\xb9\xce\x5a\x41\x70\x20\xa3\x57\x48\x79\x96\xea\x93\xc3\x69\x4b\xc4\x44\xa7\xf0\x3e\xe6\x93\xa1\xdb\x54\x9b\x32\x89\xcd\x2e\x5d\x52\x62\x0e\x2a\xad\xe8\xaa\xfd\x8d\x20\x6d\xcf\x4e\x6b\x71\xee\x8f\xb8\x84\x4d\xf1\x33\x88\x68\x6b\x2c\x6b\xb3\x9d\xb1\xaa\x52\xf1\xa5\x7b\x0c\x3b\x96\x08\xfd\x61\xe1\x5b\xf1\x83\x45\x1f\xb2\x7d\x30\xf4\xd5\x7a\xaa\x7d\x72\x25\x96\x39\x30\x37\x8f\x6a\xf3\xb9\xd1\xe2\xd0\xae\x7f\xa8\x6b\xcb\x28\x7f\x8d\x7d\x29\xc3\x20\x55\xd6\xc8\xba\x6a\x58\xed\xb2\x87\xa8\x24\xba\xa5\x8f\xd5\xe6\x49\x5c\xf1\x87\x3d\x17\xf6\x8d\xfe\xeb\x28\x75\x10\x23\xce\x12\x76\xcd\x22\x8e\xf4\x43\x63\xfb\xce\xcc\x82\x61\x09\x1d\x7d\xdc\xf0\xc5\x31\xf2\x06\xe9\x08\x6c\xe0\x78\x18\x3f\x85\xb4\x1d\x4d\x85\xac\xe5\xa6\x5e\x2e\xf2\xb1\x7a\x4b\xf9\xf7\x06\xfe\xc6\xae\x85\x2c\xd9\xe2\x11\x4a\x4e\x53\xd6\x98\xe5\x2c\x8d\x58\x0e\xb1\x15\x57\x34\xaf\x6c\x53\x35\x72\x89\x29\xaa\xd9\x85\xee\xc0\x1e\x97\x64\xa4\xdc\xa2\x47\xea\x04\x69\x18\x59\x87\x22\x37\x9f\x1f\xb2\x8b\xac\x25\x9d\x15\xe4\xa1\x45\xaa\xe3\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\x8d\xdb\x44\x04\x37\x70\xad\x89\xcd\x5d\x08\xd5\x8e\xc7\xb1\xec\xa4\x5c\x5a\xb0\xef\xfa\x9b\x32\xd8\x77\x6b\x63\x5c\xf8\x75\x9a\xe0\xda\xf4\x79\x14\x96\xf7\x51\xa5\x52\x53\xcf\x75\x8a\xd2\x60\xe7\x06\x99\x3b\x99\x9e\xb9\x33\x5e\x40\x78\x53\xef\x40\x3a\xf7\x60\x15\xbe\x83\xd7\x89\xa3\x43\xa8\x46\xd6\x9a\xf5\x0f\x26\x3f\xd6\xa7\x61\x35\xe0\xd7\x0c\x65\xa2\x0b\xdb\x7d\x1d\xd4\x68\x64\xb6\x4e\x32\x1a\x49\x73\xed\x8e\xbd\xa8\x9c\xb2\xe4\x59\x4a\xf3\x82\x3d\xff\xf8\xcb\xac\x72\x7e\x95\xf8\xcb\xeb\xbc\x88\xa3\x9f\x61\xf3\x8b\xbe\xb4\x53\x0b\x22\xcd\x35\xf7\x06\x8d\xa2\xcf\x9f\xe2\xf9\xef\x1d\x06\xb2\xa1\x34\x91\xd5\x83\x07\x4c\x9a\x25\x70\x61\xd0\x2c\xf3\xa7\xd3\xce\xa8\x02\xba\x70\xd7\x11\x77\x42\xdd\xea\x31\xc7\x12\xc1\x2a\x2d\xe4\x94\xea\x46\x02\x77\x85\x10\xc0\xc2\x37\x42\xee\x2c\x4d\x91\x23\xe6\xe4\xd0\xb6\xfe\x5c\x1a\x92\x3f\x4f\x68\x51\xf4\xda\x12\x4b\xce\x33\xa2\x25\x95\xf5\x95\x36\xa4\xeb\x4d\xd0\x88\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\x55\x0c\xb4\xda\x02\x9f\xed\x2b\x71\xc6\x80\x66\x75\x81\xa7\x16\x42\x3a\xf6\xd7\x06\x1b\xb8\x11\xe9\x80\xd5\x7e\x6a\xcd\x90\x88\xca\xc4\xf4\x4b\xdd\x2d\xda\x5e\x76\x8a\xa5\x6e\x7b\x7e\x68\xe5\x0a\xb1\x60\xe2\x91\xe1\x9f\x66\x34\x6c\xf5\x82\x4d\x13\x7f\xcd\x17\xce\xb4\xac\x75\xcc\xad\x5a\x1d\x35\x72\x09\x94\x07\xa4\x11\x38\x82\x4c\x38\x85\xd6\x55\x41\x55\x12\x86\xda\xb3\xd5\x41\xad\x18\x4d\xfa\x72\x41\x00\x08\x3a\x2f\x95\x15\xb0\x4e\x4e\x30\x6b\x39\x6a\xcb\xad\xa4\x99\xae\x5e\xfa\xa0\x4b\x6d\x77\xcc\xeb\xc4\xe9\xf2\x7a\xc7\x72\xba\x64\x0e\x6d\x05\x7a\x6c\x77\xde\x35\x49\xc1\xa6\x51\x29\x56\xea\x17\x63\x92\x2f\x6e\xa0\x62\x4e\xf7\x71\xba\xfc\x14\xaf\xd9\x9b\x62\x46\xe2\x21\xa0\x34\x10\xfd\x4f\xc7\x0d\x93\x41\xec\xf0\x7b\x11\x6c\x50\x9d\x8f\xcd\xdb\xd9\xfa\x86\x20\x15\xd7\xc7\xb9\xf8\x93\x89\x3f\x05\x3f\x30\x05\x27\x5a\xb6\x38\xd1\x15\x29\x27\xc9\x14\x6f\xc9\x0a\x98\x3c\xcd\x39\x7c\xb2\x9d\x42\xbc\xed\xed\xb4\xca\xf7\x4f\x56\xc0\x9c\x86\x42\x20\x8b\x50\x95\xde\x34\xba\x12\x06\xc8\x84\xc4\x57\x11\x19\x05\xce\x99\xae\x21\x52\xd7\x06\x0c\xd5\x91\xbf\x09\xd3\xf3\x56\xbb\x2e\x05\xa3\x7e\x31\x60\x29\xf0\x95\xfc\x9c\xe3\xdf\x43\x46\x6a\x70\x51\x74\x5b\xc0\x85\x0c\x2f\x50\x2c\xb1\x93\x40\xdc\x61\xd0\x8e\x8a\xe1\x9c\x91\xf8\x2a\x87\xfa\xae\x93\xc1\xdf\xa1\x78\x44\x4f\x1d\x67\x3b\xcc\x61\xca\xe8\xdc\xc9\xe0\x87\x7a\x46\x41\x6e\xdb\x16\x4d\x12\x98\x8e\x68\x10\x64\x5a\x91\xe8\x2a\x18\xa1\x20\x27\xab\x50\x68\xff\x39\x9c\xc2\xf4\x8c\x6c\x6d\xdb\x99\xbb\x24\xc2\x00\xb8\x39\xc2\x29\xd9\x62\x01\xb6\x99\x54\x48\x93\x39\x9e\x5f\xd2\x89\xcf\xc1\xcb\xff\xf0\x5a\xf3\x0b\x3a\x19\x89\x82\x11\x2f\x68\xaa\x64\xcd\xb0\x2c\x5d\xd6\x42\xfa\xb5\x1a\xe7\xa0\xaa\x2b\x76\x1c\x91\xdb\x13\x97\x7b\xeb\x0b\x35\x10\xce\xc9\x3c\xa4\x97\xc4\x0f\xe9\x70\x88\x14\xeb\x68\xd8\xe9\xd3\xa1\x3f\x85\xc5\x63\x1c\xda\x00\x69\x71\x8f\x01\x17\xeb\x4b\x61\x70\xc3\xbb\x32\xb1\x2e\x26\xa3\x30\xbe\x28\x74\x1f\x82\x62\x12\x4f\x27\xa3\xe9\x25\xd9\x88\x95\x24\x22\x4e\x79\x4a\x62\x84\xe5\xbb\x0b\xb2\x04\xf5\x45\x8c\x42\xa3\xc6\xa8\xbe\x68\x5f\x90\x14\xcf\xc8\xd9\x28\x9c\xd9\xf6\xe2\x72\x14\xa2\xc5\x70\x88\x05\xdf\x47\x08\x29\x26\x0b\x88\x3a\x27\x1f\xa5\x32\xa4\x9a\xb3\xc0\xe0\x1d\xc9\xa1\x3b\xd5\xcd\xee\x42\xbb\x66\x44\x3b\xd7\xd5\xfb\xdb\x41\x7f\x8b\x33\x35\x94\x05\xc2\xbb\x33\xd5\xf3\x0e\xe1\x04\x20\x44\x26\x29\xce\xa7\xb8\x20\x85\xcc\xc2\x9f\xe2\xdc\xf5\xa5\x1c\x28\xc0\x56\xd5\x1c\xe1\xfa\x73\x02\x98\xc7\x4e\xe5\x10\x6f\x73\xe8\x20\x52\x4b\x56\x4a\xfe\xe3\x57\x61\xea\xed\x14\x8a\xea\x75\x5d\x7f\xb0\x0d\x3f\xac\x2c\x7c\x44\x10\x01\xbb\xd5\x9d\xb8\xbf\xf8\x94\x09\xba\xe2\x14\xf8\x28\x47\x0a\x41\x08\x1e\x75\xab\x62\xdb\x4e\x46\x1e\xf0\xd5\x38\x6a\x3a\xf3\xed\x24\xe3\x58\xce\xff\x90\xc9\x14\x35\x28\x9b\xb3\xc6\xfc\x0d\x3e\xe0\x47\x7c\xfc\x2d\x7d\xfb\x2a\x4e\x12\x0b\x21\x84\xa3\xc9\x71\x4a\x0e\x78\x35\xa1\x53\xb2\x56\x17\x64\x82\xd7\x0e\x56\x58\xc5\x29\x0a\x22\xac\xdd\x17\x04\x49\x87\x39\xaf\xa0\xd6\xfd\x1c\x44\x6d\xbb\x65\x1e\xf0\x61\x4f\x24\x64\xdf\xe4\x21\x84\xcb\xde\x75\x92\xa8\xad\x5c\x45\xbb\xac\x5c\xbb\x1c\x23\x12\xac\x57\x65\x34\x21\xde\xd7\x4f\xbf\x40\xe1\x65\x3a\x91\x3c\x1c\xd5\xa9\xc9\xf6\xc2\xb5\x5d\x6d\x7e\x40\xab\x60\x4f\x61\x3b\xe8\x2c\xd5\x1f\xfb\xe2\xcf\xd6\x89\xcd\x3b\x51\x1e\x67\x64\x84\x0b\xe2\x87\x45\x6d\xe6\x50\xb8\x2e\x6a\x93\xa5\x62\x08\x94\xd3\x80\x2b\x8d\x22\x39\x3b\x27\x9f\x14\x53\x1c\x4f\x8a\x29\xea\x88\x78\x3b\x29\xa6\x24\x73\xdd\x9a\xa6\x08\x5b\x89\xbc\xf5\xc5\xc6\xf8\x27\xbc\xd7\x29\x29\x6a\x4b\xbc\x8e\xf8\x56\x4d\xeb\xde\x82\x95\xc0\x15\x3a\xb5\x59\x50\xed\xe9\x2e\xe5\x94\x46\x40\x01\x8f\xed\x68\xb2\x85\xd4\x62\xca\x5f\x34\x8d\x58\x2e\x79\x08\x56\xab\x18\xf4\x70\x80\x5c\xc0\x58\xc7\xe9\x92\x8f\x54\x05\x25\x49\x6a\x46\x43\x25\xf0\x85\x3c\x83\x0f\x36\x77\xad\xc1\x70\x50\xed\x84\x60\x60\xb9\x4e\x32\x2c\x91\x6b\xad\x0b\xab\x15\xe5\x4d\x1b\xdc\xc3\x17\x2f\xa0\x1e\x00\xa5\xba\xd5\x60\x53\x85\xe6\xc0\x94\xa8\x3a\x35\x30\x66\xb6\x19\x0b\x85\xcc\xb6\x59\x43\x09\xda\xcb\xce\x9a\xd6\xd6\xb8\x6a\xa0\x76\xca\xad\xe0\xb2\x03\x83\x41\x96\x0c\x9a\xf4\x28\x08\x9a\x1f\x38\x85\x9d\x53\x05\x5f\x84\x9c\xee\xc5\x6c\x2b\x8b\xf5\x6a\xbe\x02\x70\x7d\x4c\x74\x14\x47\x1d\x8d\x5b\xda\x0f\xe5\x18\xdf\x4c\x9d\xf8\x85\x17\x42\xf7\xa9\xc3\x4d\x13\x4f\x65\x2a\x67\xdb\x71\x53\xf1\xcc\x45\x77\xe0\xed\xb4\xb8\xef\x71\xce\x22\x38\x67\xcd\x58\xf0\xd5\x25\x42\x68\xd8\xae\xd6\xef\x85\x8b\x78\x2a\x9d\x89\x1b\xca\x2f\x5d\xd8\x6a\x51\x69\xce\x0d\x87\xd5\x28\x44\x38\xb9\xc9\x14\x6b\xfa\x1a\xfd\x90\x4a\xb7\x6b\xd8\x9d\x08\xf4\x35\x8c\xdc\x2e\x61\x79\xb5\x28\xdd\x6d\x81\x02\x4e\x36\x19\x12\x1a\xe2\xcd\x1b\xc1\xe1\x08\x13\x5f\xd7\xbe\xa7\x1b\xdf\x95\x42\xc5\x23\x2e\xbf\xee\x53\x1c\x1c\x2d\xd7\x29\xaf\xac\xb1\x15\x58\x16\x42\xd8\x01\x25\x42\x6d\x9c\x67\x21\x54\x5d\x36\xcb\x2f\xeb\xa6\x7b\x14\xd5\x3e\xac\x72\x79\x5b\x01\x2d\x61\x0d\x8f\x63\x90\x85\xf8\x0f\xad\xfd\x03\x7d\x9f\x5a\x41\x81\x38\x10\xef\x53\x3d\xb4\xe0\xdd\xd0\xd9\x1c\xe2\xe2\x21\xb7\xd5\x56\x94\xc0\xc9\x83\xee\xa1\xd3\x3e\xc4\xa9\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\xeb\x91\x21\xa7\x40\xbc\xb9\xb7\x6e\x9c\xce\x93\x6d\xc4\x7e\x63\x79\x06\xd5\xe7\x0f\x55\x8f\xd8\x86\x93\xa2\xb4\x84\xd3\x48\xb8\x46\xb7\xdb\x08\x3e\x51\x35\x83\xe0\x8f\x90\x94\xc7\xf3\xa5\x40\xd0\xc3\x97\x1c\xeb\x98\x99\x1a\xfd\xd8\x80\x3d\xe1\x99\x8f\x53\xb2\xe9\x0a\xa5\xb9\x42\x60\x32\xa0\xb8\x00\xb4\x32\xa2\x3e\x72\x26\xda\x97\x5e\xda\x6a\xd1\x96\x78\x81\x67\x60\x48\xb8\x23\x43\xfe\xe7\x48\x46\xe1\xb1\xe6\x23\x8e\x10\x32\xb1\xe9\x9a\x36\x39\x4e\x39\xae\x2f\x49\x39\xe1\xbf\xc1\x14\x57\x0e\x91\x8b\x22\x33\x52\x39\xee\x2c\x31\x17\xf6\xe5\x3b\x67\x51\x35\xf0\xa1\x83\x9d\xac\x48\x0f\xce\x02\xef\x10\x42\x61\x64\xdb\x67\x5c\x0e\x9c\x5d\x8e\xa0\xa3\x11\xc2\x3b\x30\xb6\xd8\x91\x11\x42\x78\x46\xf8\x58\xab\x37\x04\xc6\x0c\x6f\x7d\x84\x29\xd9\x0d\x67\x00\x00\x6a\xdb\xce\xe8\x8c\x90\xdd\x15\xad\x6d\x33\x77\x28\xe0\xf5\x30\x25\xca\xfc\x63\x4d\x76\xf8\x86\xcc\xc0\x7c\x7d\x7b\xe5\xac\xc9\xce\x4d\x9f\x52\x5e\x84\x02\xfd\x69\x08\x7f\xf9\x30\xe4\x3d\xd1\x0d\xff\xfa\x9a\x0f\x71\x77\x01\x05\x6b\x3e\x3a\x84\x9b\xf0\xbe\xc1\xeb\xe9\x29\x5e\x38\x2b\x9d\x48\x00\x26\xef\x49\x66\x94\x72\xb1\xe1\xca\x6c\x3e\x19\x4d\x83\x46\x15\x7c\xdd\x6c\xe6\xb7\x9b\xf9\x8d\x66\xc2\xb5\xa3\x15\x5a\x93\x4c\xf6\xf8\x7a\x2a\x64\xad\xce\xf7\x66\xb7\xc2\x55\x10\x42\xe2\xa3\xdb\x3d\x59\xf5\x04\xf1\xbc\xee\x7e\x23\x45\xb6\x77\x24\x3d\x77\xc6\x4f\xd3\xa1\x8f\xf0\x0b\xe2\xf0\xbf\xea\x39\xec\xe9\x91\x74\x44\xff\xdb\xe3\x6b\xfc\x8e\x43\xbb\xf3\x4b\x7d\x2d\x5e\x48\xc1\xf2\x4f\x0c\x1e\x53\x72\x3d\xdc\xe3\xbe\x21\xee\x87\xf4\x69\xda\x3b\x9c\x6b\x97\x3e\x4d\xc1\x9c\x11\xdd\xae\xbc\x26\xe1\x20\x73\x80\xcc\xcb\x07\xce\xb4\xa4\x3e\xd3\x5e\x93\x97\xb5\x5e\x3c\x5c\x79\x25\x74\xf3\xda\xe9\x9b\x55\xdf\x9c\xba\xe8\x07\x7e\x29\xf8\x3a\x9c\xdf\xdd\x39\x39\x59\xa1\xd3\x49\x37\x3c\xc9\x45\x74\xfe\x27\xcf\xb3\x74\x11\x2f\x65\x34\x0b\x11\xf0\x3c\x18\x5c\x97\x83\x84\xd1\xa2\x1c\x64\x29\x1b\x40\xf4\xf3\x15\x2d\x06\x65\x36\x58\xd1\x1d\x1b\x94\x2b\x36\x68\x53\xcd\x81\x98\xf0\x40\xa5\x86\x88\xbc\x27\xa1\x79\x01\xdc\x4f\xfd\x85\xeb\x4c\x0b\xa0\xf5\x81\xf4\x67\x61\x8a\x3f\x91\x5c\x40\x15\x7f\x24\x79\x37\xf4\x86\x79\x0f\xb4\x7f\xea\xc3\xa1\x61\xdf\xfa\x3c\xe7\x8c\xd6\x1b\x32\x0a\xdf\x5c\x7c\x52\x64\xf7\x8d\x9a\xf3\x5b\xe2\x7c\x9a\xbc\x99\x7a\xbb\xbe\x0f\xa2\xf3\x8f\xf8\x55\x1f\x46\xbb\x6f\x9f\xfe\x14\x3e\x17\x8a\xd5\x57\xe8\xf4\x2f\xc1\x15\xfc\x1c\x9d\x9a\xda\x00\x48\xb4\xff\xe9\xb8\x61\xaf\xf2\x6c\x2d\x04\xa6\x2e\x4b\xd9\x33\x08\xa4\x51\x45\xe0\xb7\x86\x16\x0a\x29\xa7\xaa\x16\xb3\xce\x48\x09\xfa\x14\xdb\xb6\x5e\x56\x0f\xe0\x5a\xae\x6a\x9f\x5b\xe8\x92\x8c\xee\xee\xba\x18\x8b\x2b\x7e\xcc\x06\x7f\x25\x95\xe6\xce\xb6\xcb\x4b\xcb\xff\xf6\x2f\xa3\x91\x3f\xf2\x2d\xdb\x2e\x2f\xac\xf1\xe8\xd9\x5f\xfc\xf1\x33\xfe\xe4\xb0\xfa\xaa\xbd\x60\xe5\xe7\xeb\x9a\x55\xe5\xa2\x63\xcb\xa8\xc3\xa8\x60\x8a\x6f\x57\x7a\xc2\x19\xef\x00\x60\xfc\x89\x8f\x2d\x27\x07\x50\x12\x88\x07\x43\x51\xc1\x31\xda\x3b\x08\x9a\x5d\xe7\xf8\x3f\x74\x24\xfe\xef\x6a\x26\xd0\x96\xec\xa0\xfa\x27\x78\xe8\xaa\x06\x39\x78\xe9\x0d\x4b\x9a\x5f\xb8\x6e\xbd\x40\x41\xff\x24\x3a\x38\x3b\x03\xf4\xa7\x47\xcc\xac\x8b\x3f\x3d\xdd\x3b\xb5\x54\x70\x47\xb0\xc1\x1f\x39\xb9\x07\x87\xd1\x58\xd6\xea\x32\xb5\x8d\xa8\x9c\xb1\x85\x3c\x5c\x1c\x62\x80\xdb\xaf\xe3\x94\xbd\x60\x49\xbc\x8e\x4b\x96\x0b\x17\x82\xd2\x2b\x36\x49\x5c\x3a\xe9\xdd\x9d\xf5\x9f\x69\x1d\x89\xa7\xa5\x32\x88\x54\x3b\x0b\x85\x43\x9f\x80\x7f\x61\x85\xd5\x19\xb2\x6d\xa3\xc0\xfa\xcf\x12\xf0\x1c\xb4\x85\xf0\x10\x2a\xe5\x8b\x52\x00\xa9\xa4\x2d\x9a\xa8\x72\x77\xe7\x14\xc4\x37\x20\x25\x2a\x8b\xaf\x89\x91\x66\x1d\xe1\x79\x73\x06\x70\x90\xb2\x00\xaa\xb5\x3d\x09\x5e\xf1\xfd\xba\x25\xf7\x84\x3d\xc5\x11\xaf\x32\x27\x45\x38\xaf\xf5\x42\x73\x45\xca\x36\x24\x9f\xcc\x81\x6a\xcf\x31\x67\xce\x36\xd5\xd6\xb4\xfe\xcd\x3a\x23\x1b\x4e\xcc\xa4\xcb\xc0\xa6\x1a\xa1\xf0\x9b\x58\x2a\x93\x82\xb1\xd4\xd1\x2c\xa4\xff\xdb\x4a\xdd\x0e\x76\x92\x1c\x67\x09\x51\x65\x93\x5e\x41\x5d\xc7\x6c\x48\xcc\xc8\xa9\xc0\x82\x1f\xe9\x09\xb4\xc5\x5a\x46\xa6\xfa\x5a\x17\x89\x3b\x00\x3f\xa4\x17\x4b\xdd\x06\x81\x91\xe5\x84\x2a\xe0\x72\xf2\x84\xc7\x67\x44\x59\x29\x5c\x39\x4a\x99\x04\x17\xb3\xce\x93\x2a\x63\xa8\xea\x98\x26\x03\x2b\xdd\xae\xcf\x23\x96\x5a\x03\x40\xd5\x62\x10\xa7\x83\xe7\x1f\x7f\x19\x44\xb4\xa4\x90\x49\x74\x91\x6d\xd3\x68\x40\xc5\xeb\xc1\x7f\x3e\x79\xe2\xf2\x4f\xba\xd6\x93\x41\x96\x0e\x92\x38\x65\x03\xcb\x75\x7c\x77\x8e\x5c\x6b\xe0\x3c\xb1\xdc\x8d\x6b\x3d\x41\x83\xfd\x2a\x9e\xaf\x06\x71\x31\x48\xb3\x72\x90\x2d\x00\x5b\x06\x8b\x2c\x5f\x7b\x16\x9f\x2e\x05\xf5\xfa\x68\x8a\x02\xf1\xfb\xe0\xd5\x3b\x7a\xe6\xc0\xb9\x30\xc7\x1b\x84\x9b\xe5\xbe\x28\x17\x12\xc5\x40\xb3\xbb\xed\xbf\x89\x06\xd0\x29\xa0\xfd\xfb\xf8\x8c\xf8\xb6\x6d\xc2\xa5\xce\xa4\x4a\x93\x92\xe5\x29\x85\xd4\x73\x0e\x4c\x18\x0f\x8a\x32\x62\x3b\x0f\x0d\x36\x34\xce\xdb\xd0\x69\x00\x80\xb3\x1f\x34\x1d\x64\x51\x9d\x95\x75\xa1\x00\xeb\x58\x6e\x35\x8e\xa1\x8f\x5c\x0b\x05\x03\x09\x2f\x30\x3d\x68\x2c\x2e\x19\xa3\xc5\xc4\xa1\x10\xbb\xaa\x05\x21\xbe\x04\x5d\x10\x5a\x4e\xa8\xfb\x58\x18\xe9\x77\xfb\x7d\xf8\x05\x98\x3f\x03\x24\x0b\xcf\xff\xef\xc1\xd3\xff\xeb\xdc\x2b\x59\x51\x3a\x33\x74\x25\x16\xae\x76\x06\x87\xeb\xe2\xc0\x61\x64\xa6\xd0\x31\xb4\x10\x7e\x46\x6a\x74\xfc\x53\x4b\xdd\x2a\x1f\xcb\xe9\x05\x6a\x11\xf7\x34\x4f\x9d\x27\x7f\x5f\xb1\x74\xb0\x2d\xf8\xca\xd5\x13\xc3\x0a\xf6\x2a\xff\x0d\x8b\xcb\x15\xcb\x07\x37\x09\x4d\x7f\x1f\x64\xf9\xc0\x4a\xb2\x7d\x38\x67\x69\xc9\xf2\x70\x15\x2f\x57\xd6\xa0\xdc\x6e\x12\xbe\x58\x90\x40\xf7\x89\x3b\x73\x9f\x58\x15\xa2\x3f\x11\xeb\x8c\x34\xb3\xc1\x0e\x98\xc1\x34\x7b\x96\x0b\x2c\xab\x2b\x9d\x9a\x6d\xf3\x8d\x7f\x11\x4f\x62\x23\x63\x04\x78\x36\x03\x59\xa8\x12\xdd\x6e\x5b\x38\xfb\xb6\x42\x2f\x11\xc3\x0b\x50\x53\x62\xe3\x9c\x6f\x45\xcb\x55\xcd\x5d\x0b\x0d\xa2\x8c\x89\xbd\x48\x97\x39\x63\x22\x9f\x62\x8d\xa1\x82\xa8\xf2\x36\x5b\x5e\xd9\x72\x37\x42\xaa\x9f\xab\x78\x30\x26\xed\x15\x68\xb1\x23\x67\x23\x79\x37\x39\x0a\x77\xb6\x4d\x2f\x16\x4d\x30\x80\x98\x7c\xe6\x8b\x40\xed\xe8\xd6\x58\x31\xeb\xd3\x8a\xa9\xfc\x8e\xc5\xe0\x89\xe8\xfb\x89\xe2\xce\xe3\x62\x50\xb0\x12\xc3\x1e\xe3\x7c\x3c\xc4\x4b\x1c\xe4\xd9\x9e\x0f\xb7\xda\x81\x35\xbd\xa1\x9b\x0d\xa3\x39\xf0\xfe\x34\x29\xb2\xc1\x5c\x04\xc3\x95\x33\xf3\x06\x7f\x8f\x93\x64\x10\xe5\xd9\x06\x7a\xe3\x1d\xc8\x39\xd3\x34\x1a\x6c\x0b\x21\x2c\xc8\x6f\xcb\x36\x16\x0a\x79\x2f\x71\xba\x65\xa7\x53\x2c\x38\xda\x45\xed\xd1\x35\x88\x6c\xdb\x31\x67\xc4\xbb\x8d\x8b\x41\xb6\x05\x92\x97\xe5\x11\xcb\x43\xf1\x67\x10\x97\x83\x79\x96\xe7\x6c\x5e\x26\x47\x3e\xc8\x62\xc3\x58\x34\x48\x32\x1a\xc5\xe9\x92\xd3\xc4\xd8\x2b\xb2\xbc\x74\xba\x23\x6c\x4f\x46\xd3\x21\xdf\x29\x27\xd4\xb2\xa2\x04\x34\x83\x34\xc4\x2d\xcf\x1f\x91\xb7\xd1\xcc\x94\xd1\xc0\xa2\xe7\x34\x7d\x52\x0e\x38\x97\x3d\x60\xeb\x4d\x79\x14\x60\x2d\x58\x69\x09\x0d\x4a\x95\x27\xa5\x0e\x42\xde\xd3\xd3\x0b\xd9\x70\x30\x97\x69\xd4\xe4\x02\xd0\x54\xf6\x9c\x67\x7b\xd5\x69\xe6\x94\xf2\xf6\x40\xcf\x7d\xd5\x89\x68\x1c\xbf\x4c\x20\xff\x0c\x7b\x5c\x1a\xc9\x54\xeb\xfb\x91\xa9\xdf\x03\x76\xd8\x24\xf1\x3c\xe6\x80\xde\xc5\xb4\xc6\x2c\xe0\x59\xd4\x22\x6b\x79\xb2\x2c\xd4\xc5\xb4\x4c\xac\xcf\xd6\x14\x4b\xab\x97\x7a\xf6\x22\xa1\x47\xab\xba\xc0\x0e\xeb\x57\xcb\x55\x31\x51\xee\xe1\x70\x6a\xef\x33\xda\xed\x6c\x00\xb9\xcd\xd4\xd6\x7f\x18\xf4\x6f\xe2\x62\x4d\xcb\xf9\x6a\x70\xc3\xca\x3d\x63\x69\xe7\xc6\xa6\x7c\x63\x73\x64\x4f\xbb\x08\x87\x48\x1c\xee\x58\xae\xf6\x35\xd7\x42\x72\xc1\x4e\xd2\x91\xb2\x4a\x9f\x5e\x8a\x2c\x38\x48\xde\x1d\xfd\x1f\x2a\x53\x54\x41\xcd\xe6\x49\x96\x32\x8e\x73\xc2\x8b\x03\xbc\x1b\x0c\x7f\x06\x89\xe5\xf1\x84\x3d\x00\xea\x0f\xd9\x5e\x9c\xf6\x8c\x9f\xf6\xd9\x42\xec\x97\xb8\x10\x38\xae\x6d\x1a\x89\xd4\xb1\xf0\x72\xbb\xbb\xb3\xd4\xde\xac\xd3\xbc\xcb\x77\xfc\x64\xfe\x14\xaf\x99\x92\x2a\x1b\xc5\x0e\x42\x3d\x63\x39\x48\x96\x2c\x4e\x81\x2e\xd6\xc3\x92\x5c\x17\x85\x0b\xc5\x6a\x4c\xa2\x5b\xd2\xea\xbe\xca\x65\x71\x6a\x5e\x05\xfc\xef\x15\xa6\x0e\x9e\xc0\xd4\xf6\xba\xe2\xb2\x83\x04\x72\xfa\xf3\x89\xde\x24\xdd\xfe\xb1\x52\xdd\x7d\xc3\xf2\x77\x8b\xca\x76\x0d\x34\x01\xda\x0b\x91\x04\x0a\x42\xb2\x8b\x90\x9e\xdb\x75\xca\xd9\x7b\x67\x04\x5b\xd2\xe2\x58\x66\x11\x12\xdf\xdd\xc1\xcf\x32\x5e\xc3\x23\xfa\x9f\x2f\x7d\x0b\x05\x3d\x9f\xa3\x80\xb9\x75\x06\xd3\x6a\xa4\x17\xcc\xd2\xe4\x38\x78\xc2\x7b\x78\x82\xc5\x5f\x0e\x82\x27\x40\x55\x9e\x88\x86\x4f\x06\x7c\x45\x8a\x01\xcd\xd9\xa0\xd8\x6e\x36\x59\x0e\xe2\x46\x96\x4b\x62\x33\xf0\xf9\xa6\xa9\xd6\x6a\x00\x21\x3a\x07\xce\xf7\x59\xc9\x59\xe1\x98\x1f\xe5\x96\x46\x40\xff\xbf\xab\x09\x00\xaf\x2f\x71\x71\x35\x99\xe2\x82\xdc\x9e\x70\x42\xce\x7c\x69\xa0\xe5\x87\xe9\x05\xab\xb3\xc7\xae\x5a\x18\x29\xbc\x61\xd4\x6a\x11\xb2\x42\x99\x38\x82\x52\x54\xaf\xa5\xcc\xc7\x7d\x46\x56\x77\x77\x67\x3d\x42\x80\x0c\x25\x7a\xad\x67\x82\x6f\xaf\xfc\x3b\x58\x79\xb5\xc4\x9c\x37\xab\xd6\x96\x0b\x3c\x83\x4a\x1d\x0a\xcb\x2f\xb8\xcb\xef\x77\xf1\x1f\xde\xe0\x89\x18\x04\x34\x02\xfc\xa9\x5b\xc6\x8b\x41\xfb\xeb\xbc\x5e\x99\x6f\x95\x45\xcc\x96\x64\x93\x4c\x33\xc2\x6a\x25\xc5\xdd\xa2\xab\x62\xb2\x9d\xaa\xc9\x07\xfc\x81\x4c\xd2\x29\x87\xe6\xe8\x74\x92\x11\x5f\x34\xf0\xc1\x42\x39\x23\xa4\x6c\xe1\x46\x61\x5a\xbb\xf4\xa5\x75\xfc\x97\x56\x93\x6c\x92\x4e\x51\xaf\xd7\x88\x26\x70\xda\xb6\x93\xba\xc4\x37\xd1\x58\x72\x15\x11\x66\xa4\x8a\x77\x21\x4c\x11\x27\x53\xbc\x21\x67\x3e\x5e\xaa\xfc\xca\x62\x4c\xb4\x5e\x7e\xa5\x79\xa8\xfd\xac\xab\x8c\x2c\x4e\x8a\x47\x9a\xbd\xa5\x59\x0e\xe7\x5a\x1f\xd5\xba\x5a\x68\xf3\xac\xdb\x68\xc7\x4e\xd0\x5d\xe3\x31\x20\x90\xe1\x79\x46\x61\x7e\xc1\x86\x3e\xc4\xe7\x91\x9d\x4d\x8c\xde\x7c\x77\xfc\x34\x47\xd8\x28\x1b\x43\xd9\x14\xd5\x97\x86\xa2\xa3\xac\x15\x09\x6d\x46\x32\x19\xe6\xa2\x6b\xa4\x33\x84\x70\x62\xdb\x2d\x8c\x99\xf5\xc0\xab\x98\xcc\x24\x4f\x23\x2c\xfd\x6e\x4f\xe1\x51\xde\xa5\x92\x16\x32\xcc\x10\x3e\x82\xf9\x29\xe1\x12\x1c\x3e\x7a\xc5\x2a\xcb\xcb\x4f\xec\x50\x76\x9c\x3e\x42\x35\x04\x69\x3f\x9e\xaf\x68\xfe\x3c\x8b\x98\xf3\xcd\xd7\x6e\xf9\xef\xe3\x6f\x90\x34\x41\x80\x1b\xc3\x45\x92\xf1\x87\x73\x5e\x5c\x5e\x8e\x42\xd4\xdb\xd4\x29\x87\x3e\xe2\xcd\x5d\xe6\x95\xd9\xeb\x6c\xcf\xf2\xe7\xb4\x00\x33\x24\xbd\x2b\xa8\x06\xdd\x55\x29\x8a\x2a\x0d\x04\x9f\x40\xc9\xc7\x6b\x59\x95\xc2\x6d\x4d\x46\xe1\xfa\x82\x03\x42\xc1\x7a\xed\xba\x68\x6d\xdb\x8e\xa8\xeb\x12\xa1\x66\x54\x4f\x6d\xf8\xad\xa7\x28\x5c\x8a\xc5\x38\xa2\xd3\xa9\x5e\xbd\x85\xbe\x7a\x71\xf1\x2a\x4e\xe3\x92\x39\x8b\x49\x3e\x45\x77\x77\xf0\x57\x06\xae\x9f\x37\xa5\xe3\xf9\x64\xde\x94\x8e\x37\x20\x1d\xcf\x2b\x91\x0c\xa4\x71\x53\x4a\xf8\x71\x99\x66\x1c\x74\x92\x35\x4a\x05\xb7\x56\x1f\x3c\x37\x6c\x4e\xb9\xd8\x97\x2d\x06\xdb\x34\x62\x8b\x38\x65\xd1\x20\xcb\x21\xed\x94\x14\x36\xc5\x89\xe5\x59\xe8\xb4\x69\x49\x7a\xda\x09\xf6\x27\xe5\xbd\xf9\x63\xe5\x3d\xd3\x09\x67\x8e\x97\x1a\x80\xd4\xed\x81\x46\x40\x9d\x25\x3e\x1b\x3d\xac\x65\xed\xcc\xd3\xdd\xe1\xc3\xd3\x91\x82\xa2\x61\xfe\xa4\xb7\x01\x9f\xb5\xc6\xd5\x05\x24\x06\xef\x89\x80\xbf\x88\x13\x26\x52\x2b\x57\xec\x71\x9d\xd3\x00\xb2\x3f\x96\x0e\x42\x10\x0d\x08\x44\x5c\x21\x7c\x20\xd4\xe7\x98\x24\xe4\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\x96\xce\x5e\xb5\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\x4e\xd3\x83\x85\xc4\xda\x13\xc2\x56\x6d\xed\x6b\xb4\xd0\x23\xbc\xc5\xda\x93\x18\x46\x4a\xf8\xde\x81\x28\xe5\xcf\xf9\x52\x54\x77\x42\xaf\xe3\xa2\x74\x3a\x2d\x7b\x63\x54\xa5\x9c\x7f\xc1\xd8\xc6\x69\xde\xf3\xe0\xf8\x61\xea\x82\xe9\x95\xd3\x4b\x2d\xfe\x1e\x27\x89\x46\x2e\x70\x4d\x09\x08\xc5\x4c\xb9\x76\x02\xd9\xe0\x5c\x08\xbb\xbb\x73\xd2\xab\xc6\x1e\x09\xda\xe6\xb6\x67\xbe\x08\xec\x69\x02\xbb\xe3\x38\xd6\xb3\x67\x88\x7c\x2a\x65\x3b\x79\x32\xdf\xf3\x31\x24\x82\xa6\xb6\xdd\xf9\x1e\x9c\x3f\xc1\x61\xa0\x2f\x03\xa0\xc8\x1e\xd3\x4e\xf3\x78\xa6\xe5\x96\x99\x25\xd9\xfc\x77\xe5\x69\x59\x97\x80\xc5\x96\xd4\x8b\x9d\x11\xa5\x4d\x00\x6b\xbf\xc6\x41\x24\x14\xa8\x55\x22\xac\x41\xb1\xca\xb6\x49\x34\xb8\x61\x83\x39\x4d\x12\x16\x09\x66\xfc\x0f\x96\x67\xb5\xc6\xab\xe0\x27\x5d\xb9\xcf\x06\x69\x96\x0e\xdf\xfe\xfc\xfa\xb5\xf6\xca\x1b\xfc\x94\xb3\x92\xa5\xfc\x9c\xe2\xa7\xd8\x9e\x16\xd0\x9a\x9f\x59\x25\x11\x91\xce\x0d\x6b\x75\x69\xac\x1a\x1b\x59\x55\x42\x75\x29\xad\xb2\xda\x98\xf9\x59\xb4\x0c\x4a\x8d\x0a\x32\x43\x0b\xd3\x6a\x88\x0f\x90\xd2\xb0\x87\x25\x4c\xdd\x18\xab\xd7\x46\x67\xf3\x24\x66\x69\x09\xe1\x19\xcc\x66\x5d\xd5\x7e\x80\x77\x08\x53\xa2\xcf\xc8\xb6\x63\x62\xcc\xc9\x4c\x48\xd6\x4a\x76\x57\x23\xa7\x91\x3c\x48\x2e\xa7\x7f\x6a\xfa\xbe\xaa\x04\x0b\x1d\x1e\xb7\x1a\x11\x28\xef\x77\xa1\xad\x4d\xed\x9b\x99\x89\x9b\x41\x5f\xea\x9a\x16\x52\x33\x91\xb2\x89\xd6\xc9\x44\xf3\x24\xe9\x6a\xa9\x2e\x45\x5b\x7e\x80\x43\x3f\x44\xdd\x7d\x0a\x2e\xed\x6c\x84\xc2\xee\x54\xf3\x46\xff\x2d\xb3\x87\x5f\x3a\x26\xd8\x4c\x10\x6c\x24\x9e\x51\xb1\x2c\x80\x15\x50\x7c\x83\x53\xf2\x39\xd7\x91\x4b\xdb\x67\xfc\x55\x4c\xce\x46\x41\x49\x20\x46\x66\x5c\x39\xbe\xa5\x3d\x04\x22\x05\x29\xef\x62\x74\x77\x97\x5e\x12\xa5\xab\xbd\x6a\xb0\xa0\xe9\x8e\x26\x71\x34\x10\x32\x84\xd2\xbb\xc6\xe9\xc0\x98\x16\x3f\x76\x52\x14\xd0\x49\xca\x89\x49\x2a\xe5\x9e\x41\x23\xa6\x86\x2e\xa0\x5a\x37\x42\xee\xd2\xd3\x3f\xa5\xd3\xab\xff\xee\x81\x04\xfc\x1f\x48\xed\x39\x49\xa7\xff\x0d\x7d\xc3\xe4\x02\x3a\xe1\x7f\xa7\x44\x7a\x54\xf6\xe1\xb5\x49\x38\x15\x63\x7c\x0b\x3b\x33\xd0\xc9\x8e\xd8\x9b\x81\xbe\x4f\xdb\x01\x51\x34\xf6\xb8\x4d\x8d\x65\xcc\x84\xaa\x06\xdf\x73\x67\x86\x63\xad\x1e\x61\xa1\x71\x85\x95\xc7\x2c\x02\xf6\xde\xf8\xc8\xe0\x86\x2d\xb2\xbc\xba\xdd\x02\x1a\x0a\x2c\x8f\x37\xf8\x94\x1f\x79\x65\xb8\x61\x2e\x57\x6c\x0d\xca\x77\xf1\xd2\x41\x03\x48\x0f\xe3\x0d\x3e\xb2\xfa\x66\xcc\x9b\x67\xeb\xf3\x92\x15\x65\x71\x5e\x0f\xd2\x5b\x95\xeb\xc4\x6a\xbb\x9e\xeb\x72\x40\x6b\x5e\xa8\x3a\x5c\x7b\x1d\xf2\xbb\xe0\xd4\xb0\xe7\xd6\x3a\x6c\xc7\xa1\x13\x4a\x8e\x6e\x5e\xbf\x79\xc9\xa1\x7a\xbd\x2a\xa5\x27\x1e\x0a\xda\x31\x21\xc0\x24\x05\xcc\x2b\x44\x80\xc4\x5e\x3b\xf3\xa6\x07\x50\x39\x6d\x8d\xee\x43\xb6\x7f\x95\xe5\x9f\x7b\x42\xba\x8e\x54\x60\x2f\x99\x38\x17\x48\x1a\xbb\x20\x34\xac\x72\xf7\xbb\xec\xf2\xd2\x57\x21\x3d\x2b\xc9\x37\xc6\x42\x3d\x9c\x5e\x94\x88\x91\xd8\xf5\x2b\xfe\x3d\xbd\x2c\x11\x25\xf1\xd0\xaf\x54\x72\x8c\x90\x58\xa1\x53\x1c\x52\x12\x57\x97\x89\xed\xa9\x03\x4e\xb4\x0f\x87\xa6\xd3\xda\x55\xd3\x1f\x03\x14\x21\x28\x28\x1b\x4e\x1f\xed\xd8\x0b\x46\x06\x8d\x56\xa8\xa0\x03\xaf\x22\x93\x7f\xe0\x3a\x8d\x43\xce\x96\x71\x51\xb2\xbc\x4a\xef\x27\x3e\x78\xcb\x12\xb6\x0e\x4a\xcc\xfb\x0e\x18\x5e\xa4\x01\x3d\xb5\xc2\xac\xb7\x73\x03\x76\xc5\x43\x69\x7d\x01\x75\x44\xf2\x68\x0f\x43\xf3\xda\xd0\x83\x62\xb6\x2a\x4e\xca\x69\x68\xa6\x03\x64\x1e\x1f\xbc\xcc\x12\x85\x99\xb7\x48\xab\x6c\x86\x8d\xb6\x64\x02\x58\xf5\xd3\xeb\x9f\xbf\xff\xf1\xed\x47\x32\xf9\xb9\xca\xd5\xf3\xb9\xfa\xf5\x5f\xd5\xaf\xdf\xaa\x5f\x3f\x54\xbf\xbe\x57\xbf\xa6\xf8\xbd\xf7\xfd\x2f\xf1\x1f\xe0\x36\x44\xfe\x51\x55\x78\xef\xbd\xb8\xfe\xf8\xc3\xcb\x17\xb3\xd7\x3f\xbe\x7d\x49\x0e\xfa\x13\x7f\xf7\xee\xd3\x8c\x97\x54\x6f\xf5\x67\xfc\xbe\x47\xbb\xdf\xab\xf6\xc7\xef\x65\x88\xb8\x2a\x56\x1c\x7e\xaf\x82\x2a\xd7\xe1\x95\xf9\x2a\xd2\x25\xfb\x4c\x64\x18\x65\xf9\xfc\xab\x7c\xfe\x55\x7e\x57\xd9\x5c\x1e\xf4\x27\xfe\x4e\xcc\xec\xc7\x46\x56\x1a\xb2\x50\x6f\xd4\x5f\x28\xc6\xef\xbd\x34\x4b\xab\xca\x3b\x26\x2a\x77\x96\xce\xb4\x3e\xba\x5e\xe3\xf7\x2a\xb4\x57\x1d\xe4\x8b\x2f\x9f\xc8\x6e\x49\x6e\x5f\xb3\x25\x4b\xa3\xa0\x5e\xc5\xeb\x03\x2b\x82\x7a\x29\x35\x6a\x1a\xd4\x4b\x08\x2b\x26\x28\x5d\x50\x2f\xf1\xf7\x79\x1c\x05\xd5\xea\x62\x50\x09\x88\x68\x36\x59\x1e\xfc\x97\x1e\x01\xe3\x45\xed\xd3\x5b\x90\x5b\x99\xa6\x49\x16\xd4\xb1\x32\xf0\x77\x34\x2f\x54\xe9\x87\xfa\xe3\x95\x69\x8b\x7a\x57\x05\xe5\xc0\xb2\x2b\x65\x80\xae\x2a\x54\x31\x3e\xf0\x4b\xa5\xa0\x55\xaf\xaa\x18\x1d\x58\x35\x2a\xf4\xd7\xaf\xf4\x61\x83\x40\xf6\x13\x4d\x35\x98\xab\x22\xf5\x56\xc4\xa2\x37\x5f\xf3\x32\xfc\xde\xe3\xbb\xcd\x6c\x2c\x4b\xe4\xbb\x46\x53\x55\x84\xdf\x7b\x2c\x8d\xcc\x86\xa2\x40\xbc\x69\x34\x93\x25\x1c\x87\xc4\x95\xcd\xeb\x38\x65\x34\x17\x46\xef\xbb\x8e\xc2\xba\x66\xa3\x8e\x7a\x5b\xdf\xb0\x99\xd7\x6d\xef\xbd\xef\x73\x9a\x6e\x13\x9a\x73\xce\x74\xa7\x3f\xe1\xf7\xfc\x6c\x78\x21\x37\x1c\xd9\xe9\x4f\x7c\x7b\x25\x19\x2d\xc5\x0e\xe4\x5b\xac\x7e\xc2\x54\xcd\x83\xbc\xc7\xcc\x63\x87\x4d\x96\x97\x05\xa9\x4a\x4f\x46\xf8\x2a\xc7\x9a\x6d\xf2\x6c\xce\x8a\xc2\xe2\x62\xef\xad\xe5\x9d\x73\xd9\x7a\x25\x96\xee\xfc\x86\xe6\x85\x15\x7c\x8d\x3b\x8a\x87\xc2\x3c\xca\x0a\xc6\x9d\x6f\x41\x41\x62\x05\xcf\x3a\x5f\x56\x06\x89\x56\xf0\x55\xb3\x82\x1c\xa6\x15\xfc\xb5\xe7\x8d\xde\xfa\x2f\x50\x47\x66\xd9\x13\xae\x91\x56\xf0\xad\x5e\xa8\x1a\x81\x3c\x61\x05\xfe\x48\x7f\xb9\xdc\xc5\x7f\x58\x81\xef\xeb\x65\x5a\xda\xab\xe1\x1a\xf2\x5e\x05\xfe\x58\xaf\x20\xf8\x24\x2b\xf0\x9f\xe9\xa5\xd2\x1c\xc4\x0a\xfc\xaf\x3b\x8a\x87\x39\x5b\xb0\x9c\xa5\x73\x66\x05\xfe\x57\x7a\x05\x71\x3b\xc8\xdb\x7d\xa3\x17\x6f\xcb\x38\xe1\x85\x30\xc1\x78\xc1\xa5\xea\x61\x49\xf3\x8d\x15\xf8\x30\x3d\x99\x5a\x57\xe3\xe5\x0a\x2b\x18\x8f\x8c\x57\x07\xc6\xcb\x7c\xbd\x6c\xce\x89\xce\x50\xf2\x4e\xc1\x78\xac\xbf\x5b\xe6\x71\x64\x05\xe3\x67\x7a\x59\x02\xa4\xcd\x0a\xc6\x5f\xe9\xa5\x39\xa7\x4a\xc3\x42\x92\x25\x2b\x18\x7f\x8d\x15\x16\x05\xfe\x69\x8a\xfd\x6f\x83\x49\x93\x0f\xb0\xb6\x05\x1b\x14\x65\x1e\xcf\x4b\x2b\xac\x72\xdf\xc6\x4a\x1d\xcc\xe7\x56\xf0\x73\x51\xa8\x07\x3d\xa1\x4a\xaf\x15\x25\xd8\x9a\xcd\x58\xf1\x26\x8b\xb6\x09\xb3\xf0\x2d\x5c\x82\x06\x67\xa3\x93\x52\x4f\x95\x4e\x0b\x78\x08\xe7\xad\x18\xc6\xb6\x5d\x7a\x75\x47\x55\x4c\xe1\xb0\xd2\xe8\x54\x0e\x6b\x25\x6a\x28\x77\xe4\xc0\x6a\x46\xc4\x14\xe5\x54\xde\x8d\x3e\x95\x4e\xb5\x29\x4b\xcc\x4e\x70\xef\x6a\xf8\x29\xee\x58\xde\x94\xbc\x05\xab\x52\x25\xa5\x5c\x32\x95\x90\xa0\xf8\xee\xf8\x89\x82\xe3\xb6\x63\x09\xd4\xb0\xaa\x60\x9b\x1d\x29\x1f\xca\x09\x9b\xe2\x98\xe4\x55\x9a\x03\x8a\x70\x0a\x89\xf8\x32\xc8\xc2\xc7\x69\x83\x48\x89\x20\xf4\x1c\x49\xf5\x2c\x14\x1a\x78\xd5\x9b\x19\x33\x8a\x77\xe0\xc7\xd3\x9f\xad\x77\xa5\x67\xe5\x4d\x85\x36\x66\xa5\x65\xf0\xcd\xcc\x22\xa1\xd7\x29\xcc\x42\xa9\xcb\x49\xcc\xd2\x3f\x80\x4f\x27\xdf\x7e\xfb\x2d\xae\x86\x77\x93\x45\x47\x23\xad\xa6\x4a\xbc\x0a\xe8\xa5\x72\xb1\x9e\x4e\x58\x07\xbe\xcc\x82\xd7\x0d\xfe\x8a\x53\x14\x3d\x68\xdc\x61\x5d\x3a\x29\xa7\xde\x86\xe6\x2c\x2d\xdf\x66\x91\x99\xa0\xd9\xa8\x24\xe5\xac\x0a\xd5\x35\x4a\x1d\x77\x52\x6a\x41\x8e\x9b\x14\xe1\x34\xc5\xe3\xd1\x03\x1b\xec\x4f\xed\xa2\xb8\x75\x49\x63\x88\xb3\x93\xe9\xc9\x40\xda\x32\x13\xcc\x59\x5b\xc4\xb3\x74\x19\x56\xb0\x49\x96\x09\x73\xe5\x34\xd5\x21\x87\xdd\xd6\x11\x03\x82\x3a\x30\x22\x3c\x63\xdd\x47\x5e\xbc\xd4\x4b\x1a\xeb\x1a\xb1\x92\xce\x57\x6d\x59\xb2\x63\x71\xf5\x79\xf6\x49\x00\x7a\x1d\xce\xfc\x33\x6d\xcd\x21\x93\x79\x37\x06\xa8\xe8\x0d\x8d\xe6\x22\x6e\x61\x27\x90\x8d\x49\xd4\x93\x6f\x8b\x70\xfa\x04\xb9\x08\x6e\x4c\x5e\x83\x4b\xa7\x21\x93\x44\x2b\x4c\x09\xab\xe3\x69\x88\x91\xb0\x68\x56\xc7\xfe\xa7\xea\x22\xa5\x91\x68\x26\x26\xa5\x8c\x45\xa0\xcd\x1c\x1b\xa1\x62\x21\x46\x55\x33\x97\x63\x15\xb9\x35\xd6\x26\x1e\xe6\x4d\xc5\x58\x89\xae\xf2\x49\x39\x75\x72\x1c\x63\x86\x53\x14\x30\x4d\xd5\xc7\x69\xac\xf9\x5c\xd5\x3b\x9d\xc0\x9f\x45\xce\x4e\x4b\x89\x9b\x91\xdb\x93\xcc\x91\x42\xf5\xb8\x1f\x32\x6e\x06\x95\xa9\x2c\xce\xea\x3c\x28\x17\xb9\x77\xb8\xbb\xab\x1e\x2f\x73\xef\xe0\xe6\xde\xbe\x2e\x3a\x5e\xe4\xde\x51\x7b\xbc\xcc\xbd\xa3\x9b\x7b\x5a\x7e\x0c\x6d\x8a\x78\x4b\xbe\x09\x57\xcd\x69\x82\xe3\x9e\x20\xb3\x60\xf0\xb1\x25\xc2\xd1\x4d\xaa\x92\x65\xfc\xad\x7b\xc9\xef\xff\x0a\x23\x49\x11\x17\x99\x8c\x19\xa3\xc3\xc6\xd2\xac\x8a\xc4\x6b\x0b\x01\x21\x95\x66\x23\x55\x8e\xe2\x7a\xa8\x56\xc7\x38\xe3\xb9\xc8\xfd\xed\xcc\x5d\x62\x29\xa5\x92\x94\x14\xea\xdd\x3e\x68\x71\x5d\x75\xa7\x08\xb7\x7b\x9d\x17\x05\x84\xdd\x83\xb9\x43\xcf\x96\xbb\xf2\x54\x29\xc2\x91\x96\x4c\x79\x2e\xbd\xce\xdb\xbd\xc0\xa1\x61\xa1\xab\x95\x38\x3e\x38\x27\xb5\xec\xa8\xb6\x92\x60\xbe\x5a\xc9\x13\x25\xf0\xbf\x01\x47\x9c\x9e\xc9\x2a\xa3\x99\xde\xb4\xd0\xeb\xa5\x85\xc2\x85\x57\xe4\x73\xb2\xf2\x78\x1b\xbc\x90\x07\xd8\x06\x2f\xd4\xa9\xb5\xc4\x91\x71\x22\x29\x33\x03\x1d\x37\x5a\x03\xa8\xac\x40\x38\x60\xcc\xf6\x8d\xd1\xf0\x4a\x7c\xe7\x39\x46\x7f\x55\x7b\xe9\x2d\x3e\x23\x75\x76\x9f\xcd\xf9\xb8\xc2\x18\x38\x95\x67\x35\x3a\xec\xc8\x48\x40\x84\x96\x9c\xb4\x5c\x97\xdf\x65\x65\x99\xad\x95\x29\x8b\xc4\xef\xe1\x72\xb8\x0d\xb3\xc9\x6c\x7a\x75\x1c\x12\xfe\x37\xe0\xff\x90\x11\xe6\x7f\x5c\xb2\x75\x97\x78\x47\x8e\x62\x9a\xbb\xea\xcb\x47\x68\x16\x69\x67\xff\x4e\x66\xa1\x36\xce\xfe\x8d\x59\xa8\xa0\xa8\x4a\xcb\xb8\x4c\x98\xb1\xb1\xc0\x86\xa4\xaa\x0f\xa1\xb9\x09\x33\x32\xad\x8b\x30\xdd\x55\x95\x1b\xb0\xac\x78\xde\x5f\x71\xe5\x45\xf1\x8e\x44\x98\x75\xe4\x87\xc5\x16\x64\x1a\xb6\x70\xea\x88\x5f\x2a\x82\x26\xb6\xea\x21\x3d\x37\x5e\x24\x08\xf5\x74\x05\x91\x8b\x39\xef\x01\xdd\x89\x38\xc6\x3b\x96\x77\x75\xf9\xa6\xf5\xf2\xa1\x6e\xb7\xa5\xd6\xeb\xb6\xec\xef\x54\x7b\xd7\xdf\x67\x24\x53\x2c\x43\x9f\xd1\x4d\xf2\xbc\x6f\xee\x2f\x9a\xef\x78\x9f\xb1\x89\xc2\x1d\x47\xa2\xe0\xcd\x22\x81\xae\x07\x52\x7a\x66\x08\x1e\x91\x82\x47\x06\xbb\x3c\x18\xe1\xd1\xbb\x69\xaa\x4c\x41\x70\x25\xc8\x29\x3c\x05\x9d\x8b\x7d\xd0\x62\xb4\x77\x77\xf5\xf7\x8a\xbc\x54\x4f\xc6\x69\x64\xc4\x70\xe7\xa3\xbb\x61\xcb\x38\xfd\x89\x96\x2b\x87\xd3\xbc\xee\xad\xb4\x73\x97\xe1\x01\xf4\x13\x9f\xb2\xfa\xc8\xc1\x47\x24\x07\x64\x96\xba\x5b\x49\x35\x3a\x9a\x54\xfb\xab\xb3\x69\xbd\xfb\xc6\xc3\x2d\x0a\xc1\x86\xbd\x60\x72\x70\x0a\x90\xf0\xb3\x8a\x3e\x7a\x6a\xf1\x51\x90\x34\xb9\xc5\x1c\x36\xd9\x8f\x87\xb9\x59\xce\xb9\xfa\xff\x1a\xce\x95\xcb\x7f\x6d\x01\x30\xfd\x3f\x56\x00\x8c\x91\x99\xa7\x45\x84\x1a\x16\x82\x79\x1d\x0a\xfb\x58\x17\x9c\xc2\xfc\x91\xbc\xf7\x81\x69\x4c\x77\xfe\x48\xa6\x5b\xb0\x80\x7a\x32\x29\x7c\x0f\x1f\x6e\x44\xba\x52\xf7\x68\x5a\xd1\xc9\xfc\xb0\xe8\xf0\x3e\x36\x14\x0c\x8e\xea\x3d\x55\xc5\xaa\xe1\x54\x80\xff\xb2\xb0\x75\x54\x27\x32\x25\x5d\x35\x2b\x36\x47\xe6\x52\xe0\xf5\xdd\xf1\xd3\xbe\xaa\x9f\xe2\xf9\xef\x22\x45\x04\xaf\x18\x96\x90\xbd\x35\xdf\xb1\x8f\x1b\x3a\x67\xaf\xd9\xa2\x74\x28\xe4\xc2\x78\x60\x50\x07\x35\xa8\x38\x8c\x4d\xb6\x0b\xc2\x46\x2b\xce\xee\xaa\xff\x55\x70\xef\x64\x2a\x9e\x0d\x3e\xf5\xb8\xf9\x1c\x2c\x84\xcd\xf9\x08\xd2\xe3\xc4\x30\xa3\x31\x21\xac\x0e\x54\x24\x22\x7d\x3e\x00\xf9\xf1\x97\x82\x7e\xfc\x68\xd8\x8f\x5b\xc0\xff\xc0\xe1\xc2\xa1\x2f\x28\x9e\x36\xd6\xcb\x31\x67\xfb\x99\x66\x4a\x5e\xee\xb3\xc1\x71\x48\x0f\x2d\x4f\x01\x5a\x0a\x4f\xe1\x32\x5e\x33\x6f\xe0\x7c\xca\x8f\x70\x51\x9a\x81\x8b\x9e\xe5\x6a\x9d\x82\x77\x92\x89\xae\xbd\x82\xa3\xd2\x5a\x95\x8d\x2b\xbf\x7b\x14\x2f\x21\x35\xc4\x44\xda\x27\x26\xf2\xf9\x4a\x43\x2a\x45\x05\x10\x96\x05\xc7\xba\xe0\x41\x2a\x61\x4c\xe4\x4b\x84\x47\xbd\x9d\xb1\x97\xcd\x7b\x4e\x05\x02\xa6\x5d\x9c\x82\xa5\x30\x24\xfe\x71\x4a\xe4\x7a\x5f\x9f\xaa\x5a\xb4\xaf\xd6\xd0\xfb\xfa\x54\x1b\xfb\xe9\x22\x1b\x24\x7f\x7b\x70\xd3\xdd\xdd\xe5\x0f\x52\x8b\x87\xeb\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\xfc\x71\x7b\xbf\x14\x12\x1b\x16\xe2\x4d\xfe\x88\x2d\x28\x5b\x9c\x4e\x78\x49\x6e\x0f\xc1\x46\x84\xa5\x3f\xf2\x1f\x47\xfe\x63\x0c\xbf\xc6\x1c\xf3\x17\xad\x2b\x5b\xb1\x30\xf7\x0a\x9d\x38\x27\xcb\x09\xef\x80\x10\x7a\xc5\xff\x06\x6c\x1a\xaa\x7c\x5e\x4e\x2c\x38\x6d\x9c\x8b\xd3\x39\x7b\x40\x7f\x28\x11\x24\xd3\x84\xbd\x5a\x2a\x3d\xc4\x85\xd0\x57\x0f\xda\x45\x43\xcb\x65\xae\x43\xaf\xac\xee\x77\x34\xb0\x2c\x84\x33\x2f\x4e\x53\x96\xff\xf0\xe9\xcd\x6b\x52\x36\x38\xd1\x0c\xe1\xf8\x14\xae\x24\x63\x29\x45\xa5\x5c\xe9\x43\xf0\x4e\xd3\x24\x18\x11\x64\xf0\xb1\xcb\x80\x40\x0f\x7e\x2d\x8b\x3a\xd6\x8a\xe1\x12\x9d\x4e\x8f\x40\x73\x38\xf0\xe2\x85\x33\xf3\x8e\x10\xfb\xc6\xb6\xd5\xaf\x46\x46\xa6\x03\xc9\xb5\xc8\x73\x6b\x32\x39\xca\x55\x16\x4b\x3c\x0d\xab\x76\x5d\x89\xa5\x4d\x87\x10\x80\x1d\xba\x2d\xc8\xce\x3b\x48\xa6\xc8\x3a\xfa\x16\xa6\x64\x3d\x19\x4d\x43\x9f\xd7\xe1\x40\xb6\x6d\x07\xea\xb8\x3b\x6f\x8f\x87\x3e\xe6\xd5\xc6\xa2\x9a\x3f\x55\x4a\x79\xda\xa9\x7d\x08\x13\xb2\xf3\x8e\x6e\xe9\x6d\xb2\xe2\xe9\xce\x5b\xe1\x8c\x2c\x1c\xf9\x65\x3e\x6b\x3c\x26\xe4\x70\xc5\x82\xda\x42\x30\x27\xc9\x30\x3d\x1f\x87\x39\x84\x53\xcb\xc9\x08\xe1\xdc\x4d\xdd\x67\x97\xf3\xab\xac\x12\xea\xf8\x11\x47\xac\x91\x15\x64\x9a\x88\x99\x8b\x8d\x23\x3c\x98\xf9\x58\xae\x9c\x4c\x97\x7d\x77\xde\x61\x48\x5b\xdb\x07\xa9\xb2\xea\xa4\x92\x1b\xb0\xea\x9a\x1d\xca\xeb\x24\x5e\xa6\xc4\xca\xe5\x31\xae\x43\xa6\xf9\x09\x0e\x24\xf7\xf1\x5d\xf2\x66\x80\xb8\xba\x5c\xdc\x31\x4a\xd1\xc1\xb6\x85\xd1\xd5\x81\x20\x84\xaa\x0c\x9d\x24\x9b\x7c\x43\x8c\xf3\x62\x32\x9a\xe2\x3d\x79\x24\x0d\x02\x36\x09\x8c\x73\x7f\x4c\x4b\xe7\xa6\x86\x31\xf6\x47\xc8\xdd\x5f\xce\x87\x7b\xdb\xd6\xcb\x49\x5f\xe5\xe1\xfe\x7c\x0c\x43\x17\x29\xcb\xae\x1b\x5b\x41\xed\x01\x56\x5c\x97\x10\xd2\x50\xd2\xe8\x77\x24\xf7\xca\xec\x27\x96\xcf\x59\x5a\x7e\x86\x3c\xa3\xce\x08\x85\xce\xbb\x4b\xff\xee\xee\xdd\x45\x15\x4d\xe9\x1d\xc4\xc9\x7c\xc7\x91\xe4\x9a\x30\x87\x83\xff\xdd\xd3\x9d\xb7\x97\x12\x94\x2c\x13\xb7\x16\xb5\x14\xd9\x0b\x85\x38\x65\x42\x96\x04\x08\xe0\x95\x26\x2e\xde\xd7\x46\xe3\x42\xf1\xaa\x21\x11\x4a\x11\xee\x1a\x53\x67\xe7\x1d\x91\xea\xb4\x2e\x72\x77\xde\x0a\x8a\x75\x61\x6d\x55\x0b\x6b\x63\xa2\xef\x78\xdb\x76\xfe\xc4\x5c\xc6\x7f\x66\x32\xe3\xfe\xd9\x50\x47\x22\x3a\x6a\x4f\xab\xf9\xee\x81\xf9\x01\x9b\x9a\x3f\x82\xf1\x06\xe2\x78\x28\x45\xe8\x34\x8e\x23\x2f\xc8\x11\x4e\xba\x50\x15\x7f\x21\xc5\xab\x88\xd2\x1e\x0b\x22\xd5\x22\x4f\x07\x6d\x63\x6a\x5b\x56\x84\xfe\xd0\x76\x73\xb6\x21\x89\xfb\xa2\x73\xcb\x4b\xb2\x5a\x0c\x5f\xb4\xb7\xf4\xf9\x38\x64\x6e\x47\xf9\x65\x04\x5e\x01\x51\x57\x9b\x7b\xa8\x12\x66\x40\x31\x19\x19\x3d\x82\xce\x00\xb5\x62\x26\x55\x12\xb4\xe7\xc5\x17\xd0\x9e\x43\x9b\xf6\x9c\xbe\x1c\x3d\x0f\x7f\x02\x3b\x0f\x4d\xe4\x14\xd1\x09\xff\x0c\x79\xf9\x55\x92\x17\xac\x13\x18\x41\x56\x7c\x84\x5f\x12\x81\xc5\x9c\xac\xac\x24\x59\x51\x65\xbc\x24\xac\x36\x85\x20\x35\xf8\xa5\xb6\x17\x58\xbd\x17\x5e\xf6\x6f\x81\xd3\x4a\xd7\xc7\x68\xaa\x95\xbc\xf7\xa2\xb0\xe7\xa6\x70\xfc\xff\xce\x4d\x21\xe8\x65\x67\x51\xbc\x13\x99\x14\x74\x49\xa5\x59\x7a\xec\x2e\x1d\x37\x8a\x1f\x7d\xd9\xa8\x19\x52\x7d\xf9\x65\x63\x87\xde\xe3\xa1\x4b\x46\xc9\xdc\xb4\xb5\x19\x8f\xe2\x72\xd9\x3d\x97\xe5\x4c\xdf\x89\xa5\x77\x10\x9b\x8c\x69\x34\xa5\xf4\x8e\x66\xa1\x74\x84\xf0\xf6\x66\xb1\x54\x9b\x97\xde\x4a\x96\x9b\xd0\xd4\x85\xbf\x59\xf7\xdd\xe8\xa4\xb1\xac\xad\x15\x6d\x2d\x66\x7b\x1d\xa7\xf8\x21\xe1\xd8\xb6\x9d\x47\x0b\xc8\xd2\x9a\xf2\x5f\x81\x69\x82\xc9\x6c\x26\xd8\xc1\xd5\x5d\xe5\x03\x2b\x7b\xcf\x92\xe6\xfa\x92\xfa\x20\x2d\x8d\x36\x07\x2b\x60\x6a\x75\x73\x6d\x75\x99\x5a\xdd\xdc\x58\x5d\xa6\x56\x37\x6f\x38\xb7\xa8\xd5\xcd\x9b\x17\x80\xa5\x4e\xef\x8e\x06\x67\x3b\xae\xcf\xa0\x87\xe4\xb2\xec\x9e\x79\x65\x8d\x11\xae\xcc\x73\xa3\x1a\xe1\xbe\xc1\xe5\xc2\x2c\x57\xe7\xe3\x21\xf3\x14\x1b\xd8\x38\x80\x78\xf9\x10\xea\xa8\xb7\x1d\x62\xa1\x10\xf1\x72\xb8\xad\x1e\x5a\xae\x23\x20\x2b\x4e\xbd\x40\x1e\x6c\x32\xd8\xe0\xa3\x76\x65\xa1\x7d\x24\xc6\x85\x26\x32\xa6\x38\x33\x0e\xb9\x02\xe1\xbc\x79\xea\xe5\xe6\xee\xea\x50\x77\xb6\x54\x2e\xb3\x3a\xef\x81\x76\x15\x5f\x7a\x60\xa0\xc5\x51\xb3\xa1\x11\x75\x2c\xc0\xfb\x4a\xdd\x48\x4c\xa5\xd9\xa7\x6c\xd3\x51\x5b\xe9\x18\x95\xe1\x89\xb6\x73\x1c\xe5\x7d\x57\x17\xde\x7b\x8b\x6c\xf4\x37\xfc\xeb\x97\x20\x51\xdf\xf2\x0d\x6a\x13\x38\x3e\x33\x43\x50\xef\x9a\x79\x6b\xbc\x8d\x55\xa0\x46\x41\xa3\x72\x53\x99\xeb\x58\x82\x64\x28\x80\x16\xa4\x53\x65\x6a\xb6\x80\xa5\x6b\x00\xd5\xa0\x3c\x4e\x81\x5a\xf4\xe8\x5e\xb0\x9a\x5d\x7e\xd9\xe6\x7c\x10\xae\x72\x86\xfd\x80\x55\x20\x68\x8f\xf9\x61\xd0\x6a\xb5\xdb\xb0\x3d\x1a\xb0\x4d\x48\x87\x7a\x7d\x24\xe1\xa7\xd3\xe8\xdc\x61\x38\xc1\x3e\xee\x99\x8f\xec\x15\x77\x7f\xaa\x6b\x90\xc7\x7b\x07\x39\x96\x4d\x6d\xbb\xa9\x13\x57\xc1\x52\xda\x7a\xe9\x6a\xd8\xe3\xc6\xb8\x57\x78\xdc\x3b\xee\x71\xe7\xc0\xc7\xf7\x8e\x7c\xac\x0f\xfd\xcf\xd9\xf6\x34\x77\xbd\x72\xf5\xd5\xb6\xd0\x9c\x7f\x31\x67\xa9\x08\xdb\x7a\xdf\xee\x6b\x23\x89\xea\x4e\xc7\x9b\x47\xf4\x57\xed\xbb\xd6\x19\xad\x3a\x3c\xf6\x74\xf8\x88\xce\x8f\x8d\xce\xc7\x1d\xbd\x8f\xff\x89\xee\xab\x35\x7b\xd8\x4a\x0b\xdd\x7e\xf9\x35\xea\xec\xf1\xf7\xa8\xcf\xfe\xe5\x7c\xfd\xa3\x19\xf0\xef\xf3\x38\x82\x88\x91\x5f\xcc\x7d\x3f\xe2\x1e\x31\xfe\xdf\x73\x2f\xa1\xb2\xea\x69\xc7\x73\xd2\xbe\x1e\x58\x91\xca\x6d\x0e\xae\x0a\x3a\x95\xc5\x22\xdf\x77\xb7\x36\x83\x83\x4e\xa9\x7a\x15\xef\x1d\x91\x89\x75\x14\xda\x96\x29\x96\x71\x7d\x26\x53\x88\xeb\x83\x17\xfc\x1f\xb8\xf9\x11\xe1\x50\x22\x3d\x1c\xca\x72\x92\x4f\xc9\xfd\x5f\x8a\x26\xf9\x14\x61\x5e\xd1\xb6\x9d\x79\x5f\xfd\x65\x1e\x47\x9a\x34\x2e\x1a\x6d\x1e\xaa\x2d\xe5\x70\x51\x7b\xf6\x50\xed\x9f\xc0\x73\x28\x55\xf5\x21\x72\xcb\x0c\xc6\xc5\xff\x55\x1a\x6e\x32\x46\x61\x46\x56\x52\x7f\x8d\x13\x65\x02\x92\xf5\x29\x76\xc0\xc3\x76\xc6\x6b\x57\x19\xe2\x41\x2b\x1b\xca\x39\x57\x3d\x2c\xe0\x39\xf1\x0a\x26\xa2\x5f\xd0\x62\xd5\x78\x74\x66\x30\xb2\xc4\x50\x5e\x70\x98\xe1\x44\xd3\x4c\x70\xb0\xe0\x98\x30\x67\xcb\x25\xfd\x94\x50\x67\x5b\x29\xb7\xb7\xde\x8a\xb7\xd7\xf5\x65\x89\x52\x0d\x70\xe9\x42\x76\xc4\x9f\xdc\xad\xb7\x17\x25\x95\x96\x2f\xd1\x12\xc2\x9e\x4e\xc6\xf3\xe9\x61\x94\x02\x05\x19\x07\xdd\xc1\x04\x9d\xbc\xe4\x78\xd4\xd2\x80\x4a\x65\x41\x66\xb6\x3d\xab\x17\x24\x5c\x3c\x04\xb6\x26\xcc\x1e\x81\x62\xf0\x25\x1d\xac\x8f\x40\x34\xa9\x8b\xeb\x42\x84\x1a\x0b\x20\x17\x3d\x2c\x4e\xb5\x26\xfb\x7a\x99\xbe\x60\x81\xf0\xd6\x3b\xf2\x67\x5d\x5f\x93\x68\x2a\x4b\x84\x1f\x82\xcb\x64\x6a\xae\xe1\x83\xc7\xc3\x63\x8f\x82\xaf\x1e\xef\x6d\x21\x5f\x43\xf0\x88\xbb\x3b\x25\x97\x5f\x10\x95\xef\xfc\xc9\x45\x14\xef\x06\xc0\x59\x6a\x5c\x25\x38\x81\x0c\x39\x24\xac\x01\x70\xb3\xc4\x12\x46\x74\x43\x71\xed\x32\x04\xbb\xaa\x60\xf0\xc4\x65\xee\x93\xd0\xba\xbc\x38\x8f\xe2\xdd\xe5\x93\xd0\xa0\xa4\x38\x21\x23\xbc\x22\x23\xc8\x4e\x0a\x91\x33\x44\xca\xd0\x2a\xb4\x2c\xe4\x0c\x4d\x5c\x52\x4e\xe2\x7f\x57\x65\x60\x93\xeb\x14\x7a\x30\x2a\x7a\xee\x24\xc3\x12\x22\x6c\xa1\x4b\x5f\x90\x4d\xd1\x93\xd1\xd1\x76\x12\x4f\x79\x57\xd3\x73\x1a\xae\xc8\x56\xbe\x3a\x55\xc1\xc0\x0a\xe2\xe3\x7b\x9b\x25\x5a\x33\xd7\x97\x11\xe0\x64\x90\x2b\xe1\x4d\x5f\x80\x1b\x7d\xfd\x7d\xde\x03\x19\xa3\x9c\x6c\x27\xf1\xbf\xab\xa6\x53\x9c\x91\xfa\x1b\x57\xdb\x89\x13\xbb\x3e\xaa\x5f\x07\x23\x1c\xb9\xe4\x3e\xb8\x47\xb4\x58\x55\x70\x5f\xd3\x7c\x19\xa7\x43\x90\x74\x39\xc0\x33\xd7\x62\xeb\x70\xb0\xa1\x51\x14\xa7\xcb\x21\x97\x7c\x83\x81\xe5\xe6\xee\x13\xb6\xd6\x56\x42\x85\x1a\xfe\x67\xdc\x6b\xfe\x67\xf9\xd7\xe8\x99\xbc\x24\xa7\x25\xe0\xd9\x54\x07\xc5\xc5\x6c\xc9\x52\x96\x83\xdd\x3b\xbc\x3b\xf3\x4f\x61\xf6\x38\xd6\x47\xb8\x7e\xd6\x8c\x4f\xf6\x10\xe3\x23\x93\x32\x98\x1a\x1a\xa1\x32\x7f\xa1\x2b\x24\x68\x15\x5c\x8e\x5e\x31\xd2\x8a\xe0\x44\xef\xee\x38\xd8\x8a\x92\xa6\x73\xfe\x2c\x06\x78\xd5\xe1\x2c\xf4\xdd\xf1\xc7\xc8\xa1\x28\xa0\x81\xf3\x80\x86\x12\xb3\x4e\x91\x52\x78\x80\xe1\xd2\x13\x26\xdf\xf1\xce\x10\x56\x18\xea\x85\xa2\x8a\x1e\xa6\x83\x5d\xe6\xd6\xcb\x52\x36\x63\xeb\x99\x0c\xb9\xe2\x8f\xf0\xad\x70\x26\x0b\xa4\x0f\x3e\xff\x8d\x23\xa6\x17\xaa\x27\x2c\x83\x0e\x04\x7a\x04\x82\xc7\xe9\x6c\x8b\x2f\xd0\xd9\x16\x1b\x9a\x5a\x28\x14\x61\x1f\x54\x80\x22\xc7\x82\x5d\x68\x61\xb9\x0d\x83\xc1\xa8\xda\x7a\xc1\x60\x04\xff\xf9\x7c\x3b\x0a\xea\xc8\x5f\x83\x2d\x96\x09\xb0\x50\x59\x52\x69\x4e\x57\x55\x14\x83\xa6\xef\x08\x3d\xe1\xa4\x33\x58\x81\x97\xb3\x4d\x42\xe7\xcc\x39\xb7\xcf\x97\xd8\xb2\xe9\x7a\x13\x5a\xa8\x2e\xb5\xa0\xf4\x1f\xdb\xac\x34\x8a\x2f\xa0\x38\x31\x0b\x2f\xa1\x70\xc9\x0b\x4d\xcc\x17\x20\xef\x94\x31\xc5\x2b\x16\x7d\x06\x64\x56\x4f\x22\xa3\x2f\x84\xbe\x55\x45\x1f\xb2\x3d\x4e\x4d\x97\x8c\x0a\xef\x05\x6e\xc9\x18\xa4\x6c\x07\x21\x48\x49\xaa\x07\xca\x70\x9a\x28\x24\xd5\x29\x32\xe2\x27\x11\x19\xbf\x45\x0f\x8b\x2c\x49\xb2\xbd\xe8\xa2\x62\xfe\xba\xed\x37\x64\xee\x3e\xbd\x5f\xd3\x05\xae\x63\xbc\xf7\x9a\x1a\xe2\x15\xa1\x5c\x70\x3c\x3c\xcd\xbd\xbd\xfb\x35\x3f\xe5\xe0\xf9\xf8\x34\xf7\x56\xc3\xaf\x47\xe1\xca\x2d\x5c\xff\x32\xf7\xf6\xb6\xed\xac\xc8\x6a\xe8\x8f\x46\xc3\x62\xe8\x40\xfa\x71\x2e\xae\xd6\xdf\xeb\xda\x66\xcd\xd1\xb6\xb7\x96\xae\x43\x4d\xdc\x95\x16\xf7\xa8\x5d\xa9\xcc\x36\x64\x2b\x0c\x84\xc4\xb1\x96\x79\x6a\xf3\x0a\x82\xc6\x25\x5f\xa7\x96\x7c\x18\xa6\x1d\xfb\x16\xc7\x2a\x70\x88\xf6\x81\x5a\x70\x8e\xf0\x43\x4b\xd7\xa0\x97\x6a\x87\x1b\xe8\x66\xd1\x64\x4f\x8f\x85\x05\x57\xb5\xf7\xa0\x50\x95\x1a\xf8\x41\x4c\x91\xb7\xaf\x6d\x90\x86\x1d\xa4\x89\xc9\xcd\xfa\x00\x80\x64\xc2\x7e\xf9\x87\x61\x61\xba\x72\x0f\x70\x68\x63\xea\x7d\x1a\x1d\x83\xf4\x41\x60\x62\xbd\x99\xa4\x7e\xad\x53\xb8\x93\x20\x73\xae\xf8\xcb\x70\xac\xa9\xa0\xd6\xbc\xa9\xe8\xbd\xfb\x27\xbc\x0f\x39\x99\x77\x70\x99\xb7\x1f\xd2\xa1\xff\x20\x92\xaa\x0b\x91\x53\x0b\x53\x3a\x55\x29\xcd\x03\x9e\xb7\x6a\xaf\x5b\xf3\x9e\x27\xc5\x85\xd2\xf8\xdd\xca\x99\x06\x25\x3e\x04\x0c\x8b\x60\x44\xc1\x64\x7a\xc2\x5b\x72\x7b\xc2\x91\x38\xb6\x95\xd1\x24\x27\x3a\x51\xc5\xc6\xcc\x89\x1f\xce\x6b\x81\x5c\xcb\x1d\x04\x8d\x3a\x92\x9d\x3a\xd1\x64\xce\xa5\x71\x93\x19\x10\x22\x85\x26\x1e\xf3\x3a\x0b\x72\xcb\xd9\x40\x3e\xfc\x20\x76\x96\x78\x23\x5c\x19\x40\x44\xe1\xa3\x09\x78\x35\xf1\x13\xea\x24\xb2\xef\xb8\x80\xe0\x49\x09\x0b\x36\x22\xbc\x55\xc2\xb0\x60\xd6\x65\x0f\x60\xfd\x06\xa3\x51\x51\x50\xf1\x76\xc2\xdb\x4e\xc9\xe2\xa4\x1b\x4a\x30\x15\x2b\xb7\xec\xce\x4a\xc7\x85\xb1\x1d\x99\xc9\x8c\xb5\x55\x68\x10\x70\x0f\x3e\x00\xd8\x77\x8a\x85\x63\x78\x86\x23\x48\x51\x84\x0b\xac\x65\xfa\x3f\x92\x09\x24\xc0\xd7\x8c\xd9\xe6\x64\x14\xce\x2f\x0e\x00\xcd\xe3\x64\x3e\xed\xfb\xfa\xd1\x72\x9d\xf9\x95\xef\xce\x21\x27\x9e\xcc\x90\xd9\xc1\x63\x7d\x5c\x65\xfb\xdf\x58\x9e\x89\x3c\xfa\x16\xc2\x37\xa2\xd6\x0f\x2a\x97\xba\x8a\x3c\x08\x83\x12\x5f\xa7\xad\x25\xdd\x13\xca\xc1\xbd\x20\xdb\xc9\x5e\xb8\x91\x88\xe0\xc1\x47\xb2\xf7\x8e\x3b\x9a\x80\xbd\x99\xf8\x69\xdb\x67\x6b\x65\x99\xb4\xaf\x3c\x35\xd0\xc2\xab\x56\x86\x9c\xf9\x75\x50\xcd\x7b\x90\x45\x7c\x09\xe1\x6b\x72\x9c\x6c\x40\xa7\x31\xf4\xa7\xf8\x1d\xb9\x6e\x83\x1c\xbf\x20\xef\x14\xb0\xe5\x88\xae\xb1\x68\x0f\x30\x8f\xaa\x14\x5d\xb2\x53\x14\xe6\xca\x76\x73\x81\x6f\x8f\x80\x42\x2f\x4e\x48\xb6\x21\xe4\xc6\xb6\x1d\x3e\xe4\x0a\x4c\x0c\x12\xcb\x54\x39\x4c\x9c\xb2\x4d\x93\xb5\xf1\xdc\xdd\x65\x8a\x3d\xaf\x53\x98\xa9\x01\xae\x80\xa8\x35\x5f\x3f\xe4\x2c\x70\x06\x38\x69\xec\x9b\x55\xb6\x17\x3b\xf3\x5d\x5a\x8d\xd3\x52\x49\x0f\x2c\x71\xab\x42\x71\xc3\x4c\x5f\xa2\x05\xdb\x50\x20\x12\x71\xca\x64\xe2\x8c\x2a\x1e\x67\xe9\x1d\x44\x00\xec\xea\x24\x62\x5d\x07\x50\xfd\x1d\xaa\x87\x42\x56\x71\xd7\xe4\x1e\xd3\xc2\xaf\x55\x1c\x8a\x78\x35\x49\xa7\x61\x5e\x63\x85\x6d\x3b\x16\x3f\xf4\xe0\x86\xdc\x25\xf1\x95\x75\x71\x93\x9f\x5f\x5a\x81\x35\xb0\x10\xa6\x2e\xb1\x2e\x38\x8b\x2a\xc5\xc2\x27\x8b\x2c\x2d\x87\x7b\xe1\xd5\x38\xb8\xc9\x92\x28\x1c\x48\x99\xdc\x72\x73\xb1\xd3\x5d\x2b\x7c\x72\xc9\x9f\x14\x21\x71\x2d\x78\x59\x11\x0d\xd7\xba\x38\xe7\x7d\x5e\x5a\x55\x2e\x07\x7a\xe2\xcc\xdd\x41\xbc\x0d\xfe\xe4\xac\xc0\xfe\xa6\x9a\x18\xba\x8d\xc5\x94\xf8\x84\x2e\x2d\x14\x56\x73\xb1\x5c\xa8\xa7\xe1\xd8\xd5\x13\x25\x12\xaf\xaa\x05\x7d\xc2\x77\xb8\x6b\x5d\x0e\x2e\x6e\x2e\x0d\x10\xf4\xce\xb7\x3d\xc1\x8b\xf3\x9b\xcb\xc0\xfe\x37\xff\x9b\x51\xc8\x2b\x1c\xcd\xd9\x9f\xea\xd9\x6b\x0a\x98\xec\x4b\x0d\x6f\xbe\xfe\x02\xad\x4c\xcd\xd6\x9b\x02\xf4\x55\x19\xdc\xca\x4f\x05\xe5\xe9\xff\x57\xc2\xbb\x39\xe8\x76\x50\x16\x84\x0b\x12\x3b\x19\xa4\xc8\x83\xaa\x7a\x90\x14\xce\x8e\xc7\x4e\x82\xf0\xb6\xc5\x23\xac\x68\xf1\x29\xdb\xce\x57\x10\xe5\x69\x41\xe7\x6c\x46\xac\x2a\x72\x77\x9d\x54\x05\xea\x80\xf7\xa3\x92\x6f\xdf\x64\x37\x71\xc2\x5e\xb0\x5d\xcc\xdb\x9c\xaf\xe1\xf1\x8e\xa6\x51\x9e\xc5\xd1\xf9\x32\x16\x09\xcd\x52\xba\x8b\x97\xb4\xcc\xc0\x46\xe0\x17\x96\x17\x71\x96\x2a\x11\x59\x7d\xf1\x39\x88\x9a\x91\x50\x34\x6c\x1f\xa7\x68\x30\x02\x41\xd5\xfa\x86\xed\xe3\x2e\x5a\x44\x6c\x3b\x09\xcc\x2a\x18\x68\x45\xc5\x66\x82\x7a\x1a\xdf\xe0\x2c\xb5\x70\xfb\x82\xd1\xd6\xe0\x72\x10\x36\xac\xa6\xf4\x3b\xd2\x99\x29\x9d\x8b\xb8\xba\x1f\x4b\x5a\xc6\xf3\xd7\xf4\xc8\xf2\x59\x87\xa0\x2e\x2a\x69\x41\xb7\x44\xcd\x93\x39\xb9\x3e\x96\xef\x66\x29\xce\x54\x5d\xa3\xb3\xe8\x28\xe3\xac\xe7\x6f\x59\xb6\x16\x6e\xa9\xfa\x1b\x50\xa5\x35\x5f\x99\x1f\xaf\x01\x45\xba\xe3\xac\xeb\xd0\xd5\x0e\x07\x5e\xc7\xec\xa9\x60\xa5\x74\x9a\xef\xee\xd0\xec\x49\xc4\x40\x9d\x94\x53\xc2\xcc\x6e\x9a\x6b\xd2\x8e\xae\x0e\x15\x9e\x03\x18\x58\x1d\x5b\x56\x14\xd7\x93\xad\xdf\xc4\x69\xac\x87\x56\xab\xca\x75\x1c\xa1\x69\xbc\xe6\x88\xcb\xdb\x4b\x97\x7d\x23\x8a\xe5\xb5\x7c\x3f\xf8\x83\x57\x80\x74\x2e\x10\x29\x68\xa0\x22\x05\x81\x93\x96\x48\xea\xb5\xde\xd0\x92\x1f\x07\xe1\x20\x8a\x0b\x7a\x93\xc4\xe9\x72\x60\xf4\xef\x29\xb3\x84\x0a\x1a\x46\xf4\x6c\xe7\xd6\xa8\x1d\x9c\xf9\x27\x7c\x56\x25\x95\xe8\xd8\x6a\x23\xe9\x73\x1c\x45\x9f\x32\x19\xe9\xb9\xb1\x36\xda\xab\x9e\xd0\x93\x4a\x6c\x92\xe1\x7f\xeb\x15\x97\xe5\x61\xd9\x16\xa8\x2a\x04\x6d\x2a\x82\x4c\x54\xed\x7c\xdb\x40\xda\xce\x3a\x4d\xf4\x6d\x4c\x4a\xa8\x93\x5e\xe5\xd9\xfa\x71\x33\x0b\xcb\x76\xfc\x1a\x63\x0a\xad\xb7\x8b\x7b\xdf\x76\x4c\xa1\x55\xa7\x35\x05\xdc\x80\x76\x7b\x47\x1a\x44\xa7\x2d\x31\x3f\x4c\xd9\xba\x8c\x7d\x5a\x4d\x73\xbd\x99\x32\xd2\x71\xbf\x6a\x81\xb8\x49\xe5\x5a\xdb\x51\xa0\x6e\x1d\xc7\x76\xe6\x54\x0a\x0b\x19\xdd\x59\xed\x37\x4e\x3c\xf5\xae\x1c\xd4\xf9\xb5\x16\xb9\x7c\xdc\x27\xcf\xe4\x59\xa6\x62\xb8\x03\x5c\x2a\xcb\x08\xd0\x06\x76\x11\x07\x3e\xa8\xd6\x17\x5b\x23\x6b\x7d\xb1\x0f\xd7\xee\x5f\x1c\xce\x65\x94\xa8\x7b\x1b\x5f\x99\x88\x21\x4f\xa8\xea\x59\xb3\x1d\x95\x11\x6a\x8d\xed\x1e\xf4\x9c\x67\x8d\x04\xa7\xaa\xb7\x2a\x9a\xba\xb9\x83\x6a\xc3\x3d\x9d\x06\x84\x85\xc8\x77\x93\x6d\xb5\x5c\x1c\xe8\x96\xa9\xb0\xe2\x23\xcc\xaa\xd8\xea\x27\xec\x57\x1c\x76\xd9\xc2\x6b\x8e\x0d\x7d\x5e\xa7\xc2\x2e\x55\x40\x33\x25\xb1\xf4\x70\x94\xd6\x08\x10\x9d\xff\x03\x2d\xe3\xcc\x61\x28\x2c\x35\x35\x0a\x55\x76\xa5\xa5\xae\x88\xa1\xca\x04\xb5\x54\x2e\x46\xde\xfe\x69\x8a\x4b\x65\xbc\x49\xbd\x15\x3c\x1a\x5e\x48\xca\xa0\xb3\x34\x0d\x3d\xa9\x32\x00\xf5\xcf\x48\x6a\xdb\xcc\x2b\xe6\x34\x61\x4e\x8a\x53\xe1\xe4\xd3\x80\x56\x15\x71\x88\xcb\xba\x49\x56\x6b\x95\x46\x61\xcf\x59\xda\xe3\x03\xc2\x45\x89\x36\x56\x19\x0e\xd6\x12\x13\x8c\x83\xac\x23\x24\xce\xf8\x69\x67\xb5\xda\x77\xa3\xca\xc0\xc1\x89\xdd\x07\x36\x2f\x67\xe4\xf6\x10\x30\xef\x80\x8f\x01\xf3\x8e\x2e\xf3\x56\x2e\x75\xbf\xc2\xfb\x80\x79\x7b\x2c\xa3\x4b\x3f\x48\x4d\x4e\x5a\xce\x0b\x63\xda\x6f\x45\x00\x49\x25\x66\x6e\xaa\xc5\xb5\x50\x58\x36\xe8\x32\x36\x1f\xe7\xe5\x61\xd6\x1a\x2c\xa4\x5b\x68\x50\xec\x06\xbb\xd4\xd7\xae\x8b\xf7\xa8\x58\x8b\x7b\x38\xb2\xdc\xa8\xab\x88\x49\xf5\xbe\xeb\xb6\x09\x60\x54\xb0\x64\xa8\x6a\x59\xcd\x46\xfd\x26\xc9\x9d\x15\x55\x94\xb8\x0e\x10\x11\x7d\xf3\xb4\x4f\x3a\x93\x93\xec\x9e\xcb\xe2\x51\x73\x59\x98\x73\x59\x3c\x76\x2e\x8b\x7b\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\x24\x0f\x90\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\x51\x09\x9d\xcc\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\x9f\x3d\xb2\xfe\xf7\x39\x8d\x38\x47\xa5\xda\xd1\x47\xb4\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\xa4\xb3\x09\xde\x08\xed\xca\x12\xfe\x84\x99\x81\x93\x99\x86\x93\xf3\xda\x84\x70\x41\x46\xe1\xe2\x22\xe5\xbc\x4d\x75\x62\x2c\xea\x3c\xff\xe2\xc5\x64\x31\xc5\x3b\x22\xdd\x2b\x66\x93\xd1\xf4\xca\xe1\xff\xc2\x1c\xd1\xd3\x55\xf0\x96\xbe\xc5\xc7\xfa\xbd\x3f\xbd\x9a\x0f\x1d\xfe\x57\x42\x14\x3d\xdd\xf2\x3a\xa1\x13\xdf\xdd\xc9\x8c\xba\x9b\xbb\x3b\xcd\x8f\x74\x87\xce\x88\xf6\xb8\x81\x88\x64\x55\xb2\xfa\x1d\xb2\xed\xea\xe1\x88\xae\x54\x56\xde\xcd\x55\xa6\xf0\x7f\x87\xe7\x28\x88\x6d\x5b\x2b\x58\xf2\x39\x57\x4f\x47\x84\x37\x64\x87\x97\xe4\x88\x02\x95\x8f\x74\xc3\x3f\x72\xe5\xf4\xb6\x99\x23\x14\x54\x8f\x1b\xfe\x88\x37\x44\x00\x57\x84\xdc\xaa\x5e\x46\x78\x8e\x20\xee\x46\xed\xea\x56\xaa\x50\x83\x1d\xf4\x4a\xe8\x8a\x45\x3a\x2c\xb5\x25\x80\x68\x8e\xf8\xd2\x30\xdb\x86\x1c\x80\x80\xf2\x1f\xcb\x6c\xe3\x8c\xf8\x01\xd4\x28\xf3\x71\x89\x3a\x74\xf4\xde\x22\x4e\x12\x41\xc9\x0e\x38\x83\x27\x07\x9d\xa8\xba\xb1\x34\xeb\xea\x74\x8f\xe2\x7f\x82\xb0\xf2\x1d\xa7\x93\xd4\x4c\xf3\xf3\x6b\xa8\xc9\xef\xdf\x8d\x1d\x1a\x46\x73\xdf\x75\x91\x8c\x24\x5b\xc2\xed\x99\x85\xc0\x58\x51\xcf\x8e\x8b\x53\xc2\x74\x0b\x64\x2e\x85\xb1\xfd\x40\xe4\xa6\x8d\x11\x2e\xb8\x44\x91\x10\x66\xa6\xb2\x5d\x29\x87\xbb\x92\xf8\x61\x79\x11\xd7\xa9\x4d\xb6\xdd\x37\xb2\x3f\xa6\xe6\x9d\x2c\x4e\x21\x7b\xcd\x4a\x98\x08\x6f\x11\x96\x18\xb7\x85\x28\x90\x5c\xfc\x88\x17\x4e\x81\x9a\x9f\xc8\x26\xe5\x94\xac\x26\xe5\xd0\x9f\xd6\xc9\x68\x5b\x15\x12\x51\x41\x7a\x3e\x4f\xf1\x9c\x30\xd8\xa5\x32\x80\xfc\x0c\x6f\x08\xd3\x73\x84\x6b\x33\x31\x81\x03\x5d\x72\x34\xe6\x83\x85\xe9\x2d\xc9\xdc\x63\x87\x92\x33\x66\xd2\x88\x96\x55\xd9\xfe\x71\x89\x37\x28\x64\x5a\x92\x64\x07\x5d\xfa\xb6\xed\xf0\x46\xbc\x30\x4e\x97\xd7\x3b\x96\xd3\x25\x73\x96\xd8\xac\x87\x37\x08\xe1\x48\x40\x63\x29\x2e\x38\x17\x35\x8c\x47\x61\x79\x11\x4d\x46\x53\x23\x91\x8c\x22\x50\x33\x32\xc2\x3b\x32\xc2\x47\x32\x0a\x8f\xb5\xb5\xf8\x51\xad\xc8\x81\x44\x93\xe3\x74\x52\x4e\x27\xfe\x34\x94\x84\xe1\xa0\x0c\x88\x0f\xe8\xee\xce\xd9\xb9\x2e\x9e\xb9\xe4\x80\x4e\x0b\x31\x82\x09\xff\x18\x6f\x31\x9a\xe2\xd9\xf9\x6e\x2a\x06\xb4\x26\x6f\x21\x87\xae\xf7\xe6\xfa\xf3\xec\x97\xeb\xd7\x3f\xbf\xc4\x37\x64\xd8\x2c\xd3\x86\xbc\x68\x25\xbe\xd9\x93\x85\x36\x90\x33\x42\xf6\x1a\xe1\xda\x73\x9a\x76\x46\xef\xee\xf6\x97\x10\x19\x6d\x5d\x6b\x0a\xd7\x78\x8f\xf0\x4d\x7d\x80\xdc\xe0\xbd\x20\x30\x14\x50\xe4\x86\xe4\x5e\x92\x2d\xfd\x91\x73\x83\xf0\x8d\x4b\xbc\xf1\xd7\x4f\x6f\xf0\xba\x2a\x5d\x23\xdc\x31\x22\x39\x94\xaa\x96\x7c\x46\xb5\xed\xf4\x35\x7e\x47\x6e\x86\xeb\xf0\x9a\xbc\xbb\xa8\x26\xff\xe3\x5b\x31\xd1\x2b\xf8\x4a\xc0\xff\x7d\xc7\x3f\x7a\x8d\xd7\x43\x72\x2d\x6f\xe1\x6f\xe1\x4a\x68\x81\x39\x71\x0f\xd6\x98\x1f\x9e\xc1\x4d\x63\xa7\xb7\x8c\x23\x7a\x98\x8c\xde\x13\x95\x75\xbd\x87\x7d\x26\xfc\x29\xf8\xf9\x52\xf2\x35\x8c\x6b\xc8\x8d\xb0\xc3\xf8\xc9\x04\xee\xae\xe7\x90\xb7\x4b\x7f\x57\x8a\x3b\x01\x5f\xbc\xcb\xdb\xc7\xe8\xc1\x6d\x9f\xb8\x4f\x63\xc5\x11\x3c\x58\xd3\xf1\x87\x29\x27\x2a\xd5\x37\x5b\x75\x8e\x6d\x56\xee\xe8\x76\x71\x00\x5d\x9c\xbd\xbc\xe5\x41\xe7\x63\xb0\xe2\xec\xaa\xa1\xb4\x37\x9d\x2f\x35\x95\x4c\x3e\x4c\x0c\x67\x92\xae\x8a\x65\xb6\x51\x99\xc5\x3a\xa5\x09\xbd\xbf\xcc\xe8\xaf\xa7\x26\x04\x64\xbb\xf7\x7b\xf7\x0d\x47\xbf\xd3\x94\xae\x19\xf7\x7f\xae\xab\x41\x9b\x09\xbe\xd7\x32\x48\xc3\xd3\xc5\x7f\x87\xb8\xa3\x99\x76\x98\x5c\x9d\xaf\x0e\x36\x13\x0b\x7c\x5c\xf3\xb8\x3d\xfa\xef\x2f\x11\x5f\x5e\x65\x39\xeb\x16\x5f\x1e\x7b\xd2\xd7\x3d\xe8\xe7\x7d\xdc\xd0\xb6\x6b\xbb\xce\x6f\xde\x6b\x0c\xdb\x5b\x89\x6f\xc5\x8a\x18\xb2\xf6\xa5\x4c\x47\x8b\xb0\xd4\x38\x1d\x2b\x5f\xde\x50\x67\xfc\xd5\x08\x0f\xea\x7f\x2c\xf7\xfe\x99\x5c\x27\x9b\x15\xb5\x50\x65\x43\x2c\x22\xdb\x63\xd1\x6f\xb5\xae\x69\xd7\x32\xea\x95\xf2\xce\xc5\x1f\xe6\x3d\xed\x3a\xc5\x44\x1f\xfb\x9a\x2c\x97\x36\x9e\xa8\xf6\x94\x37\x9e\xf4\x9a\x4c\x3c\x55\xe2\x1e\x70\x10\x8f\xfa\xa2\x6f\xf4\xca\x1a\x4f\x7e\xbf\x10\xd9\x85\x95\x3d\xdb\xa7\x87\x50\x61\x26\xc2\x1e\xbf\x4a\x32\xda\xad\xb8\xd1\xa8\x0c\x72\x4b\x4c\x5b\xf5\xef\x21\x4b\xc8\x2d\x43\x15\xb7\x52\xc7\xc1\x80\x61\x13\xc5\x02\x8a\x15\x06\x07\x6c\xe8\x5f\xb6\x31\xee\xee\x8e\xba\xfe\xc5\xa3\x8e\x01\x23\xfe\xe8\xf6\x11\x6e\x10\x7d\x19\x54\xbb\xb3\x9b\xb6\xd2\x9b\x9e\xa6\x27\x7c\x7b\xc2\x13\xff\xaf\x53\xe4\xf8\x7f\x45\x27\x14\xfe\xaf\xf3\xf3\x7f\x1b\x14\xd9\x36\x9f\xb3\x37\x74\xb3\x89\xd3\xe5\xcf\x1f\x5e\x93\x28\x2e\x4a\xd5\x25\xdf\x6b\xde\x7f\x15\xde\x9a\x6e\xfe\x9f\x00\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), + modTime: time.Date(2022, 10, 16, 17, 51, 16, 603013162, 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"), + compressedContent: []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x02\xff\xec\xbd\xfb\x77\xe3\xc8\x75\x20\xfc\xfb\xfe\x15\x12\x36\xa6\x51\xcd\x22\x1a\x20\xa9\x17\xd8\x68\x1d\x50\x62\x77\xd3\xa3\x16\xd5\x14\xd5\x0f\x6b\xe8\x3e\x10\x59\xa2\xe0\x86\x00\x1a\x28\xea\x61\x89\xe7\xb8\xbb\x1d\xaf\x63\x7b\xe2\xf7\xda\x5e\xc7\x71\xec\xf5\x3a\x8e\x1f\xeb\x67\x36\xe3\xc4\xeb\xfd\x27\xbe\x3d\xf9\x79\x97\x33\x8e\xf3\x65\xbe\xff\xe1\x3b\xf5\x02\x0a\x20\x48\x75\x8f\xa7\x27\x39\xc7\x99\x69\x81\x40\xd5\xad\xaa\x5b\xb7\xaa\x6e\xdd\xaa\xba\xf7\xd6\xf5\x6b\x8b\xff\x61\xe1\xda\xc2\x11\x3e\xf6\xca\x3d\xc7\x3f\x71\xa2\x05\x43\xd3\x35\xbd\xe4\x78\xc3\x23\x47\x33\x8c\x85\x1b\x47\x18\x0f\x23\xf3\xfa\x75\x09\x46\x3b\x42\x21\xfe\x38\xf2\xb5\x5e\x70\x7c\x93\xa4\xdf\x08\x86\xe7\xa1\x3b\x38\xc2\x0b\x6a\x0f\x2c\x94\x75\x63\x75\x61\xdb\x7d\xe2\x39\xd1\xc2\x49\xe0\x2f\xdc\x61\xd0\x52\x56\x99\xe4\x6d\xe4\x21\x27\x42\xfd\x85\x91\xdf\x47\xe1\xc2\xdd\x66\x67\x61\xcb\xed\x21\x3f\x42\xff\x61\xe1\xda\xf5\xff\xb0\x78\x38\xf2\x7b\xd8\x0d\x7c\xd5\x86\x08\x5c\x28\xc1\xc1\x47\x51\x0f\x2b\x96\x85\xcf\x87\x28\x38\x5c\x40\x67\xc3\x20\xc4\x51\xa1\x30\x15\x73\x1c\xf4\x47\x1e\x5a\x67\x3f\x1a\x87\xb3\x90\x0a\x4c\x45\xe4\x99\x00\xf7\xd1\xa1\xeb\xa3\x42\x81\xfd\x6a\xce\x71\x7f\x9d\xbd\xaa\xfb\x5d\x88\x80\x39\xab\xdc\x75\xfe\xab\x49\x14\xa2\x65\xd8\xd9\x90\xb1\x8a\x8f\xdc\x08\xc6\xd5\x01\x17\x21\xc2\xa3\xd0\x5f\x48\x2a\x08\x2e\x4e\x9c\x70\x01\x59\x17\xe3\x9a\x08\x5c\xc0\x6a\x08\x2e\xdc\x43\x15\xed\x87\x5d\xc0\x53\x90\x77\x51\xa1\x1a\x49\xe2\x5b\x24\xc8\xba\x70\xcd\x10\x7a\xe6\xa2\x01\x79\xa4\x79\x31\x1e\xd7\x78\x22\x9b\x24\xea\x39\x9e\xa7\xfa\x22\x2d\xf4\x61\xf2\x8e\x01\xf4\x35\xcf\x5a\xd4\x93\xb0\x31\x4f\x8a\xb5\x63\xcb\x86\x58\xeb\x59\x08\x62\xad\x6f\xc9\x4d\x02\x43\x70\x81\xb5\x80\xb6\xce\xe5\x65\x8b\x52\x49\x63\xa4\xdb\x09\x83\x21\x0a\xf1\x39\x05\xbb\xe8\x05\xfe\xa1\x3b\x18\x85\xce\x81\x87\x28\x8a\xfe\xe8\x18\xf1\x2f\x1d\x0e\x10\x36\xc3\x31\x18\x43\xac\xf9\xd6\x34\x45\xec\x42\xc1\xd6\x1e\x3f\x46\xd1\x5d\xd6\xa8\xd3\x54\xb4\x49\xa1\xce\xc8\xc3\x63\x33\x27\x32\xa6\x02\xd6\xfa\x2a\x82\x8a\xa3\x40\x04\x20\x22\xc5\x05\x56\xba\x87\x71\x40\x5e\x93\x61\x18\xe0\x80\x34\xb9\x76\xe4\x44\xad\x53\x5f\xd4\x89\x51\x92\x24\x20\x79\x0c\x2d\x45\x81\x58\xc5\x5a\x64\x95\x57\xc0\x58\xdd\x4f\x51\x08\x83\x0b\x65\x14\xa1\x85\x08\x87\x6e\x0f\x2b\xb5\x7c\x22\x21\xa8\x24\x15\x54\xe0\xc5\x89\xe3\x8d\x08\x69\xc6\x80\x36\x71\x68\xcd\xeb\x39\x04\x71\xf7\x50\xb5\xc3\xd0\x39\xd7\xdc\x88\xfe\xaa\x36\x10\x1d\xc6\xae\xb9\x87\xea\xee\xf9\xf1\x41\xe0\x69\x2e\x46\xa1\x83\x83\x70\xc1\x15\x95\x94\x00\xd3\x39\x92\x72\xb1\xb5\xdf\x85\x21\xed\x16\xd6\xa2\x01\xeb\xd6\x49\xe0\xf6\x17\xf4\x1a\x0e\xcf\x2f\x0e\x83\x50\x25\x30\x0e\x8c\x2c\x7b\x3f\x93\x7f\x57\x05\xb5\x45\x35\xb4\x54\xc7\x8a\x34\x1f\x9d\x61\x15\x00\xad\x1f\xf8\x08\x14\x0a\x2a\xd6\x86\xa3\xe8\x48\x75\x34\x5a\x4b\x00\x17\xd1\xe5\x25\xd6\x3c\xe4\x0f\xf0\xd1\xa2\x65\x21\x50\x23\x45\x82\xda\xb8\xe7\xe0\xde\x11\xe9\x07\x3e\x41\xa1\x6e\xd9\xe3\x43\xd7\x77\x3c\xef\xfc\x82\x20\xb0\x18\x16\x0a\x91\xc6\x70\x4f\xde\x54\x10\x03\xb9\x87\xaa\x0f\xf0\x51\x18\x9c\x2e\xd4\xc7\x71\x77\x1e\xd3\xea\xd5\x58\xb8\x8f\x4e\x17\x3a\xe7\x43\xd4\x08\xc3\x20\x54\x95\xa6\x7f\xe2\x78\x6e\x7f\xc1\xc1\x18\x1d\x0f\xf1\x02\x0e\x16\xfa\x28\xc2\xe1\xa8\x87\x47\x21\x5a\xf0\x03\xbf\x44\x6b\x78\xe0\xa1\x05\xd7\x8f\xb0\xe3\xf7\x90\x02\xc6\x63\x15\x40\x5f\x6e\xa2\x78\x00\xdb\x8c\x96\x82\x56\xd8\xd2\x6b\xf8\x06\xe2\x75\xad\xe1\x62\x91\xd1\x39\xb4\xd0\x3e\xee\xd6\x42\x2d\x19\x17\x96\xfc\x71\x79\xb9\x68\xc0\x50\x93\x47\x11\xa1\x88\x42\x09\xa8\xb8\xfe\x42\x58\x28\xa8\xa1\x76\x1a\xba\x98\xc7\x01\x38\x6b\x34\x86\xda\x13\x74\x0e\x43\x10\x53\x24\xc6\x1b\x41\x4c\x06\xb4\x20\x54\xa1\x60\xab\x28\x19\x03\x84\x47\x84\x34\x0c\x86\x64\xf4\x8c\x55\xd6\x37\xeb\xd6\xf5\x8f\xfc\x47\x75\xdf\x29\x1d\xea\xa5\xb5\xee\x45\x65\x0c\xfe\xe4\xba\x0b\x9d\xbc\x71\xac\x1d\xd3\x06\xad\x03\x3e\x20\x17\x17\x51\xa1\xb0\x3f\x74\xc2\x08\x35\x7d\xac\xa2\x7d\xa3\xbb\xaf\x77\x8b\xfc\x17\x1a\xcb\x00\xa6\x23\x0d\x1e\x69\xe4\x45\x96\x79\x64\x99\x45\xfa\x23\xcf\xeb\x8e\x61\x94\x46\x6f\x99\xa1\x17\xcc\x41\x2f\x9a\x83\x9e\x16\x8d\x0e\xc8\x48\xf6\x07\xaa\x0e\xcb\x60\x1a\x0b\x09\xa0\x0c\xab\xf3\x01\xaa\x70\x19\xc8\xa8\xba\xd6\xf5\x8f\x84\x83\x83\xd7\xd5\xd7\xa3\x6b\xea\xeb\xfd\x0b\x03\x56\xc6\xe0\xf5\xe8\x1a\xbc\xe2\xfb\x75\xf0\x27\xd7\x61\x6f\x4e\x8d\xdc\x74\x8d\xb6\x47\xc7\x07\x28\xa4\xd8\x00\x18\x7f\x94\xe5\x8f\x4a\x37\xc6\xca\x63\x58\x39\x2f\x8d\x16\xff\x5e\x7f\x5d\x5b\x7f\xbd\x5f\x8c\x11\x1d\xcd\x41\xd4\x4b\x10\x55\x51\xa1\x20\x06\xca\xcd\x2a\x78\x71\xb4\xe3\x8f\x6a\x17\x74\xc7\xf0\x5e\xaa\x38\x96\xfb\xfe\x5d\x07\x1f\x69\xc7\xae\xaf\xda\xa4\x9f\x95\x97\x96\x00\x94\x82\x8c\xe9\xa0\x32\x0f\xb2\x05\x46\x95\x75\x7b\xbf\xd2\x35\x39\x8d\x4e\x73\xea\x34\xd8\xb7\x35\x1c\x6c\x05\xa7\x28\xdc\x70\x22\xa4\x82\xae\x98\x86\xe8\x70\x1e\xc3\xbd\x19\x1c\x03\x81\x8b\xc5\x29\xe6\xbe\xa8\xda\x31\xc7\x21\x02\x08\x00\xb9\x0c\x6c\xc3\xf1\xfd\x00\x2f\x90\xf9\x69\xc1\x59\xe8\x79\x4e\x14\x2d\x38\xd1\x82\x13\x0f\x72\x45\x88\x22\x36\x1b\xbd\xd8\x4a\x4f\x1b\x08\xac\xdf\x53\x11\x30\x1d\x95\xcc\xe8\x3d\xfa\x1c\xd1\xe7\x29\x7d\x06\xf4\xb9\xaf\x43\xf2\x3f\xad\x3d\xf4\xad\x50\xc5\xa4\xaf\xd7\x2d\x9f\x90\x33\xb2\x7c\x42\x42\xd7\xf2\x09\xd9\x3c\xcb\xdf\xaf\x74\x6b\xa4\x4c\x2d\xb4\xea\x90\xbe\x0c\xac\x88\xbd\x1c\x58\x2e\x7b\x71\x2c\x4f\xf0\x23\x52\xe9\xfd\x8b\x27\xe8\xdc\x54\xdc\xa8\x13\x3a\x7e\x34\x74\x42\xe4\x63\x05\xb2\x59\x71\x7a\x2a\xd4\x2d\xcb\x62\xb9\x8c\xc7\x90\xa5\xc4\xc1\x2e\x1d\x64\xb3\x13\x11\xe4\x17\x45\xba\x42\xc1\x88\xdf\xd7\x15\xd2\xdd\x55\xa5\xc8\x70\x2e\x2a\x90\xbf\x0e\x92\xd7\x83\xe4\xd5\x29\x2a\x40\x31\x49\x9a\x2b\x93\x00\x65\x3c\xee\x02\x68\x13\xd6\x89\x84\xc8\x62\xed\xd1\x86\x18\x58\x17\x38\xa9\xab\xc9\x29\xac\x77\xa1\xe3\xb9\x3d\x74\x40\xea\xb0\x5f\xae\xea\xb0\x5c\x5d\x25\x5d\x91\xd3\xde\xf1\xb1\xfb\xb1\x11\x3a\x3d\x72\x31\x89\x5f\xd2\x61\xb9\xb2\x04\xcb\x46\x1c\xff\xb1\x91\x43\xf2\x22\x29\xa4\x54\x1f\x1b\x39\xc7\x4e\xe8\xfa\xc8\xdc\x37\xca\x2b\x2c\xd6\x28\x8b\xd8\x8f\x8f\x42\x51\x58\x2a\xd9\x01\x72\x07\x34\x62\x09\xd2\xbf\xb2\xe8\x01\x07\x6e\xf4\x31\x8a\x1f\x01\x2f\xaf\x42\x63\x6d\x59\xc4\x78\x4e\xef\x89\x99\xea\x2e\x07\x9e\xe3\xf7\x8e\x50\xdf\xf1\x8e\x03\xbf\xcf\x13\x11\xa4\xf5\xb8\x1c\x5a\x59\x92\x42\x2a\xdb\x1b\xa1\x13\x37\xf0\x10\x36\xf7\x8d\xca\x2a\xac\x56\x60\xb9\x1c\x97\x12\x06\xa7\xbe\xb9\x6f\x2c\x2f\xc1\x6a\x99\xfc\xe3\xc1\xa3\xd0\x3b\x3f\x0d\x02\x52\x48\xb9\x0c\x8d\xd5\x2a\x34\x2a\x22\xc3\x9e\xd3\x47\x98\x95\xb4\xb6\x04\x8d\xa5\x55\x68\x2c\x0b\x14\x7b\x47\x4e\x88\x43\x34\x8a\x24\xfa\x24\x71\x41\x2f\xf0\x1c\x4a\x6e\x43\x87\x86\xbe\x04\x2b\x71\x5c\x10\x3a\x1e\xab\x11\x49\xb6\x2a\x85\xfb\x87\x1e\xe1\x04\xac\x40\x43\xd7\xa1\x51\x5d\x83\xe5\xca\x8a\x04\x11\xb9\xde\x13\x4e\x0e\xd2\xc6\x31\x75\x7b\xa1\x7b\x1c\x05\x3e\xa9\x84\x0e\xcb\x3a\x4c\xd0\x3c\x77\xfc\xe9\xc6\xed\x3b\xe1\x93\x84\x82\x46\x65\x4d\x0a\x17\x29\x48\x68\x3a\x66\x10\x78\x7d\xe4\x87\x84\x56\x8c\x4e\x55\x68\x18\x72\x7c\xe8\x9c\x13\x0a\xaf\x41\xf1\x27\xc7\x21\xc4\xb2\xd5\x93\x66\xe6\x11\x33\x13\x3d\x39\x72\x9e\xb8\xa4\xb0\x35\x68\xac\x56\xa0\xa1\xaf\x48\x91\xc7\xce\x00\xf9\xd8\x21\x4d\xbd\x36\x55\x89\xc0\x73\x4f\x10\x2f\x73\x75\x89\xa6\xac\xca\x89\x83\xd0\xf1\x07\xbc\x37\x1a\xd5\x34\x46\x41\xd8\x3b\x72\x49\x1d\x97\x2a\x90\x0c\x16\xbd\x2a\x45\x86\xa8\x2f\x4a\x94\xd3\x44\xb4\xa7\x9a\xfb\xe5\x4a\x05\x1a\x4b\x3a\x34\xca\x65\x39\x16\x39\x1c\x17\xa3\x5a\x81\xc6\xea\x2a\x24\xbf\x52\x3c\xe9\x2b\xac\x3d\x56\xca\x70\xd9\xc8\x54\x86\x46\x33\xe2\x56\x57\xe0\xca\x1a\xf9\x37\x15\x8b\xf2\x63\xf1\x28\xfc\xd8\x28\x70\x23\xda\xd4\x65\x7d\x19\x96\x75\x39\x3a\x1e\x2e\xd5\x55\x32\x94\x92\xe6\x44\x68\x38\x74\x7d\xd1\xd7\x48\x57\x5c\x91\xa2\xa2\x27\xe7\xa2\xfb\x18\x6b\x86\xdc\xb1\xdc\x63\xde\x0b\xf4\x25\x28\xfe\xa4\x28\x94\x1f\x15\xf4\x07\xa2\xdf\x57\x48\x59\x55\x29\xcb\x43\x37\x44\x07\xa1\x4b\x58\x84\xb1\xb2\x0a\x2b\x55\xf2\x8f\x47\x79\x64\x30\xc5\x8c\x8d\xf4\x70\xc2\xfc\x44\xc3\x1c\x06\x21\x8a\x30\xa7\x3c\xe9\xac\x95\x35\x29\xed\xa8\x77\x14\xb9\x0e\x4b\x27\x73\x91\x81\xe3\xfa\xd1\x41\x10\x06\x7c\x30\xf1\x3f\x1e\x79\x14\x44\x58\x14\x48\x46\x60\x8a\xd3\x92\x01\xc2\x11\x31\x12\x6e\x20\x0d\x9b\xb2\x41\x58\xc8\x12\xac\x88\xde\xc1\x89\x45\xf8\x21\xff\x13\xe1\x62\xb8\x94\x57\x93\x8c\x48\xe0\x39\xf2\xbc\xe0\x94\xd0\xa2\x42\x4b\x8e\xdb\x85\x13\x77\x2a\xab\xa3\xc0\x47\xe7\x7d\x74\x2a\x71\xeb\x98\x42\x47\x01\x4e\x5a\x99\xb6\x49\xcc\x8f\x5c\xbf\xef\x3a\x3e\xed\xee\x84\xeb\xae\x95\xc9\xbf\x24\x6a\x10\x98\xfb\x2b\x4b\x74\xdc\xc5\x29\x4e\x82\xf0\x5c\xb4\x83\x5c\x0a\x1f\xc6\xb4\x78\xda\xbc\x22\xc2\x73\x4e\x90\xdf\x47\x21\x19\x37\x2c\x8e\x34\x60\x3a\xee\xc0\x1b\x45\x47\x82\xe5\xe9\x74\x52\x11\x00\xa7\xbe\x18\x55\x65\xd2\x61\xca\x31\xa1\x3c\x74\x1c\xf8\xbd\x23\xf7\xf0\x90\x8e\x49\xd1\x31\xe2\xfe\xe6\xb9\x83\x23\xce\xd7\x29\x19\x8d\x65\x5a\xb8\x14\x29\xb8\x74\x55\xcf\x50\x93\xc5\x52\x16\x59\x2e\x57\x33\x6c\x95\x46\xc6\xcd\x2d\x5a\x8a\x96\x4d\xfe\x8c\x54\x11\xac\xe9\xc9\x90\x13\x7f\xa9\x48\xce\x2e\xaa\xb0\x5c\x59\xa5\x23\x22\x1d\x3b\x3b\xa9\xd4\xa0\xab\x65\x68\xac\x55\xe4\xc8\x98\x4f\x91\xe8\x65\x99\x4f\xb1\xe8\x98\x51\x55\xca\x90\x8c\x36\x63\x25\x85\x73\x3c\xee\x0d\x3a\x19\x2f\xcb\xed\x45\xe3\x13\x4e\x65\x18\x64\xfa\x58\x86\x84\x8b\x4e\x43\xa0\x39\x10\x18\x21\x4f\x34\xce\x32\x95\x13\xca\x69\x2c\x13\xc2\xf2\x9e\x56\x4e\xa8\x73\x8c\xc4\x6c\xa7\x4b\x61\xbc\x52\xbc\x13\x48\x38\xfb\xc8\xe7\x0d\xc4\x3b\x27\x8b\x88\xe7\x96\x2c\x73\x38\x76\xc2\x20\xf0\xd9\x30\x4b\x66\x80\x63\xd4\x77\x47\xc7\x29\x89\x49\x2f\xd3\xa2\x12\xfa\x31\x18\x49\x6c\x89\x7b\x23\x8b\x89\x67\x9d\xd5\x65\xb8\xba\x24\x35\x2a\x8b\x1e\x8e\xc2\xa1\x47\x32\xae\xae\x40\xc3\x28\xc3\xb2\xb1\x96\x8a\x4f\x5a\x8e\xb4\xea\xca\x1a\x34\x8c\x4a\x1a\x20\x99\x63\x8c\x32\x99\x4b\x59\xcf\x4a\x81\x0c\x89\x34\x1c\xb3\x1e\x42\x16\x63\xa9\x9a\x02\x91\xa6\x93\x95\x32\x9d\x4b\x92\xe9\x91\x41\xb0\x19\x85\x4d\x93\x6b\x6b\xb0\x4c\x26\xb3\x18\x13\xb7\xef\x27\x43\xaf\x4c\x5a\x8f\x56\x46\xc4\xfa\xb8\x17\x22\xe7\x98\x8b\x8f\x7c\xd8\x8a\xc8\x08\x9f\x87\x41\x24\x49\x90\xe5\x72\x4c\xc1\xa0\xd7\x73\x22\xd7\x97\xa4\xcb\x55\x41\x3e\xdf\x39\x71\x3e\x1a\xc8\x73\x04\x11\xf3\x56\x2a\x49\xf4\x39\x97\x82\xe2\x31\x1e\x78\x7d\xcf\xe9\x51\xf0\x0a\x93\x62\xe3\x8e\x41\xe5\x8a\x84\xcb\xa6\x82\xfb\xa1\x73\x40\x5a\x7e\x05\x1a\xd5\x32\x8c\x85\xc8\x94\xa8\xb1\x9c\xf4\x4b\x16\xce\x18\xec\xd2\x12\x5c\x5e\x93\x62\x58\x57\xa0\xb3\x05\x6d\x6b\x41\xe2\xa1\xe3\x21\x79\x3a\xa9\xac\xc2\x32\x1d\xa9\xba\x0c\xc0\x79\xc7\x52\x19\x96\x97\x0c\x48\x7e\x93\x48\xa9\x01\x8d\x95\x25\xc8\x72\x58\x95\x00\xa4\xf6\x23\x7d\x8c\x94\x9f\xcc\xfd\x43\x67\xe8\x9c\x3b\xa7\x47\xee\x50\xc8\xe4\xa4\x85\x05\x2d\x87\xc8\xe9\x1d\x0d\x47\x87\x87\x62\x0e\x24\xed\xb0\x14\x47\x86\x23\x36\x95\x90\xfe\xb0\x1c\xa7\x49\xb8\xd5\x1a\xe9\x50\x71\xb8\x37\x22\xfd\x80\x74\x9f\x65\x32\x01\x8b\xe6\x1c\x06\xa7\xfd\x58\x44\x5e\x59\xa6\x63\x3f\x69\x9e\x78\x94\xd0\xb6\x49\x5a\x34\x44\x07\xa8\xd7\x73\xe2\x68\xbd\x0c\x29\x65\x2a\x71\x7c\x5f\x8c\x75\x91\x55\x18\x44\xe7\x62\xcd\xc0\x05\xb6\x44\x68\x0b\x83\x73\x87\xf3\xa8\x65\x36\x71\x26\x9d\x31\x72\xfa\x7d\x0f\x89\xa4\x95\x35\xd2\xb2\xf1\x60\x4d\xf8\x2f\x9f\x58\xe2\xa6\x8d\x1c\xbf\x2f\x0a\x2c\x57\xab\xd0\x58\xae\xc2\x78\x89\x94\x8c\xee\xea\x32\x15\x63\x56\x57\x92\x98\xe8\x08\x79\x9e\x98\x21\x97\xa4\xe6\x8c\x5c\xe4\xfb\x44\x40\x5e\xd6\xe1\x6a\x19\xc6\x33\x67\xe4\x7a\x27\x64\xd2\x25\x14\x17\x7f\x3c\x66\x8a\xbf\xc7\xdd\x58\xe6\x1f\xfa\x32\x5c\x93\x39\x58\x8a\xed\x97\x59\xc5\xe2\x19\x2b\xc5\xf1\xa7\x22\xfd\x84\x91\xcb\xb3\xff\x14\x2b\x62\xab\x25\x1e\x99\xcc\x10\x2b\x4c\x00\x49\xc4\x16\x4c\x67\x66\x83\x05\x25\x92\x06\x46\x64\x3a\xcf\x4e\xe6\x64\xcd\x8d\x3d\xba\x4a\x5b\x66\x82\xac\x21\x28\x8e\x83\x63\x07\x07\x0c\xb5\xb5\x35\xb8\x22\xfa\x9f\x34\x7e\x96\xab\xac\xf7\xe9\x22\x3b\x21\x4c\xd3\x19\x9b\x0a\x34\x22\xe6\xf4\x08\x39\x98\xb3\x35\xca\x7e\xd6\xe2\x08\x49\x76\x95\x45\x09\x1a\x11\x1d\x07\x4f\xe4\xc5\x74\xdc\x82\xd9\x19\x50\x4f\x85\xc7\x0c\xa0\x9a\x9a\xee\xc6\x35\xa4\x75\xda\xf6\xf6\xee\x8e\xdd\x6e\x6c\x77\x2c\x1f\x9d\x2e\xec\xa9\xf1\x26\x02\x18\xc3\xf7\xf4\x50\x02\x22\xad\xe7\x78\xbd\x11\x69\xfe\x2d\xba\x21\x76\x2b\x0c\x8e\xef\x93\xf8\x07\x2e\x3e\xda\xf3\x5d\x6c\x21\x6d\xab\xb1\x7d\xbb\x73\xe7\x71\xe7\xd1\x4e\x43\x1c\x1c\xd0\xcd\xee\x3f\xca\xbd\x72\x58\xb7\xb0\x5a\x01\x35\x35\xb4\xea\xa0\x50\x08\xa5\x03\x2d\x4a\x15\x27\x43\xb0\x8b\x9d\x87\xa6\x0e\x77\x1a\xed\x8d\xc6\x76\xc7\xbe\xdd\x30\x8d\x31\x8c\xfe\x95\x77\x0c\xd9\x56\x1d\xa9\xa0\xa5\x7c\x40\xb1\x2c\x0b\xf1\xdd\x6c\x55\x34\x53\xc9\x00\xeb\x8e\x26\x61\xed\x68\x3b\x0f\xf9\x46\x23\xdd\x06\xbf\xe5\x05\x0e\x56\xe9\xf9\x8b\x1b\xb1\x03\x20\xcb\x8d\xb6\x9d\x6d\x15\x83\x75\xdd\xc4\xb9\x9b\x80\x3b\x28\xec\x11\x99\x6d\x80\x66\x6f\xe7\x25\xa8\x59\x96\x8c\x41\xbc\x23\x38\x40\xd8\x3e\x88\x02\x6f\x84\x11\xed\xa8\x53\x59\xd9\xe9\xbc\xe4\x62\x55\xb0\x6e\x5f\x53\x13\x94\xaf\x1b\xba\x0e\xcc\xe4\x7b\x3c\xee\x0a\x6c\x89\x94\x83\xa7\x33\x4f\xce\x16\x09\xfd\x49\x93\xe5\x6d\x05\x46\xb5\x17\x18\x58\xd9\x91\x1c\x9d\xba\xb8\x77\xa4\x62\x70\xd1\x73\x22\xa4\x0c\xcf\x14\x93\xbe\x7c\x40\x31\xa5\x22\x23\x15\x15\x31\xa8\xd1\x18\x74\xcc\x41\x42\xf2\xc6\x06\x15\x87\x11\x1b\xf0\x0b\x21\xab\xd9\x35\x8b\x40\x5b\x96\x85\xd7\xa5\xf6\xb3\xb5\x08\x9f\x7b\x48\x3b\x0c\x7c\x4c\x1f\xbb\xee\xc7\x11\x30\xd3\x5d\x92\xb5\x3a\xd2\xd8\x8e\x66\x7c\x06\xbb\x6e\xab\x18\x98\x72\x67\xc8\xcd\x6c\xac\xda\x00\x86\x35\x4e\x99\x74\x4d\x14\x5d\x01\xe3\xf1\x7b\xcf\xd3\x28\x52\xf5\x60\xe4\xf7\x37\x46\xe1\x09\x8a\x2c\xa9\x35\x76\x9c\x7e\xdf\xf5\x07\xf5\xe0\x6c\xc7\xc1\x47\x72\x4c\x3d\x08\xfb\x28\x4c\x22\x68\x2e\xe4\xfd\x56\x10\xb2\x38\x11\xb8\x19\xf4\x46\xc7\x88\x55\x50\xce\x61\x23\xf0\x31\xf2\x71\x3d\x38\xcb\x2f\xd1\x92\x51\x23\x58\xf1\x17\x99\xa9\xfe\x31\xb2\x54\xdf\x72\x54\xac\xae\x00\xc2\x5c\xc9\x5b\xa5\x0c\x40\xa2\x3c\xe1\x48\x23\x3a\xab\x42\x60\x9b\x17\xa2\x67\xd9\xe3\x31\xa1\x81\x44\xd6\x19\x4c\x96\xa0\x07\xfd\xf7\x95\xd5\x7a\xe8\x10\x5b\x88\xb3\xdd\x60\x68\x61\xf6\x7a\xea\xf6\xf1\x91\x15\xb2\x8f\x23\x44\x96\x5d\x96\x2f\xe8\x19\xaa\x36\x95\x09\x04\x43\x3a\x0c\x83\xe3\x0d\xcf\x45\x3e\x6e\xa3\xde\xf4\x21\x4a\x9a\xea\x9c\x39\xd1\x82\x8b\x18\x22\x52\x6a\x31\x84\x88\x15\x09\x11\x2f\x2d\x61\x5e\x30\xb0\xd4\x74\xef\xcc\x0e\x4a\x9e\x73\xa4\xa5\x11\x51\x6d\x6d\x80\x30\x4d\xe3\xfa\x03\x29\x1c\xd0\x64\x63\x98\x3f\x12\x72\xd5\x35\x18\x57\xb0\x19\xd6\x68\xbf\xd2\xd5\x0e\xe8\xb8\x7b\x40\x91\xb6\x69\x25\xd0\xbe\x9e\x0d\xa6\x75\x2a\xb1\x53\x59\x29\x66\x2a\x07\x00\x6d\x5e\x6f\x02\xac\x67\x81\xcb\x69\xe0\x34\xea\xd2\xd0\xce\x12\x46\x8c\x3c\xbd\xcb\x58\x2d\xf4\x2d\x8a\x0a\xfb\xa8\x5b\x34\x67\xf6\xe1\x58\x14\x27\xfa\x51\xcb\xab\xb4\x53\xc4\xf9\xd5\x0e\x8b\x78\x66\xc5\x71\xb6\xe2\xd9\x3c\x8a\x4e\xd1\x97\x2b\x9f\xcd\xaa\x88\x33\x95\x2f\x86\xc5\x3a\x23\xc0\x34\xbf\xcb\x3b\xf5\x3d\x08\xfa\xe7\x10\x5b\xb6\xd6\xe7\x90\x0d\x0f\x91\x9f\x1a\x19\x54\x84\xed\x60\x69\x24\xf1\x51\xa4\x08\x95\x18\x76\x3c\xeb\x9c\xa9\xf1\x0b\xd2\xa2\x5e\x18\x78\x1e\xab\x27\x96\xbf\xc4\x69\x2e\x85\x0a\x0e\x0f\x23\x84\x05\x94\xf4\x95\x82\xea\xd1\x3e\x29\xa0\xa4\x2f\x40\x38\xcf\xec\xd2\xef\x50\x6a\xc5\xc5\xb3\xcf\x9c\xf2\x63\x38\xf9\x33\x07\x83\x18\x4e\xfe\x04\x20\xdd\x0f\x88\x9c\x4f\xb8\x53\x4c\xfb\xf4\x04\x94\x1e\x36\x5c\x62\x40\x4c\x62\x58\xd0\xc5\xec\x1a\xa8\xb4\xd3\x6c\xa1\x43\xdc\x1a\x61\x14\xc2\xf8\xb3\xe9\xfb\xe2\xb3\x4d\x8a\x97\xa2\xe9\x37\x8d\x67\xd2\xc5\x82\x91\xc9\x6e\x76\x02\x48\x7a\x00\xc6\xc1\x71\x0a\x44\x0a\x92\xb3\x2d\xcb\xd9\xbe\x40\xb2\x38\x48\xae\x4e\x12\x22\x67\x5d\x31\x33\x62\x46\x52\xc4\x9c\xc4\x70\x2e\xb1\xc0\x94\x7c\x42\xd8\x2c\xd3\xd7\xdb\x8f\x55\x01\x52\xf3\x46\x5d\xc8\x81\xeb\x3e\xd3\x90\xb2\x89\x78\xdd\x77\x4f\xdc\x3e\x52\xb5\x25\xb8\x68\x00\x60\x8a\x28\x00\xf1\xdc\xb4\x38\x93\x56\x4f\xd2\x92\x99\x74\x6e\xda\x70\x2a\xad\x16\xa2\x13\x14\x46\x48\x4d\x72\x21\xb3\xf0\xdc\x5c\xd0\x14\xf6\x39\xb9\x20\x00\xfd\x31\x80\x2e\x99\x45\x66\x48\x54\x39\xfa\x1b\x79\x94\x9f\xd5\x19\xa6\x5b\x8f\x86\x74\x67\xcc\x30\x57\x16\x99\x1d\x0a\x39\x3d\x79\xba\xff\xd1\x90\xee\x38\x4f\xc6\xcc\x9f\x16\xf0\xbe\xab\x75\x5a\x3b\x8f\xb7\x1a\xb7\x3a\x5d\xc2\x76\xb3\xcb\x17\x95\xb3\x71\xba\xb0\x4c\x01\x1b\xb9\xc0\x7c\xe2\x86\x4e\x0c\xdd\x6e\xde\xbe\x73\x55\xde\x51\x16\x7a\x7e\xe6\x01\x05\xaf\xb7\x3a\x9d\xd6\xdd\x17\xca\xdf\xcb\x49\x30\xbf\x88\x91\x9c\xe2\x05\xa8\x73\x6f\x1a\x7e\x7e\x01\xa7\x64\x78\x9e\xb2\xde\xa9\x86\x45\x07\x5c\x8f\xf3\x12\xa1\xa3\x62\x90\x13\x5a\x2f\xde\x23\xa1\x71\x3e\x3c\x38\x2a\x7a\x52\x30\x9d\xbb\xf6\xe2\xd9\x43\x73\x86\x43\xef\x9c\xce\x21\xf0\x14\xd4\xf6\x6e\x1a\x44\x92\xbe\x6e\xed\xc1\x3a\x79\x38\xe4\x11\x91\x47\x40\x1e\x1e\x79\x8c\xc8\xe3\xde\x75\x6b\x0f\x70\xbd\x11\x31\x9f\x3b\x70\xc3\x8a\xe7\x6a\x0f\xf6\xe3\x88\x00\xde\x4a\x22\xee\x71\xd6\x73\x21\x8f\x20\x33\xbc\xa9\x5f\x5e\xd6\x6f\xea\xeb\x3d\x2e\x51\xb0\x0e\x0e\x43\x58\x87\x49\xdf\x02\x26\x99\x6c\x7c\x31\xd0\x53\xa0\x00\xca\xe3\x63\x3a\xc3\x17\x96\xcb\xe2\xf9\x4f\x87\x61\x69\x5a\x14\x93\xa2\xeb\xa5\x6c\x62\x70\x25\xb2\x2f\x8a\x06\xad\x4e\xc2\x3f\x4c\x87\xd4\x27\x92\xeb\x33\xe0\x24\x72\x60\x04\xa5\x21\x32\xa3\x58\xde\x16\x12\xad\x12\x4e\x91\x93\x79\xac\x7a\x36\x10\xe2\x5a\xae\x54\x9a\x4b\xc0\xc1\xcd\x59\x49\xd6\x75\xd3\x99\x22\x29\x8c\xa6\xc8\xf8\xe2\xf5\x29\x65\x85\xe7\x99\xe4\xcc\x72\x64\x33\x20\x95\xf6\xe4\x4a\xf7\x79\xe2\x0d\x18\x40\x0f\xa6\xd9\xc2\x8b\x90\xb5\x98\x0c\xbe\x2c\x33\xce\x29\x2d\x26\x71\x1f\x26\x95\xc9\x27\x71\x0c\xba\x11\x0b\xc3\x39\x35\x94\x7a\x66\x30\x45\x17\x00\xbd\x52\x76\xa9\xf0\x52\x55\x9c\x45\xe9\x78\x60\x4f\x2d\x44\x60\x66\xc6\x33\x47\x84\x06\xf7\xa6\x06\x79\xf1\x16\x1c\xc1\x7b\x30\xc5\x24\xe7\x8d\xf4\x29\x32\x27\xa3\x7e\xaa\x84\x59\xc3\xed\x96\x4c\xad\x51\x0e\xe1\xef\xcd\xa1\xd6\xcb\x8f\xee\xd9\x44\x1a\x8f\xe1\x85\xe0\x18\xa6\x0e\xe3\x6e\x6f\x1a\x50\x6e\x1b\xb3\x0c\xa5\xc2\xcd\xca\x18\xa4\x14\x6e\x99\x78\x07\x1d\x36\x7b\x47\x16\x5b\x14\x44\x1f\x0b\xb1\x5a\x06\x25\x03\x5c\xaf\x5c\xab\x92\xc9\xf1\x5a\x04\x7b\x56\x78\x2d\x82\x9e\x65\x17\x31\x1c\x59\xa8\x18\xd6\xb8\x34\xee\x70\x69\x3c\xe1\x60\xf2\xa6\x57\x2c\x5d\xa9\x99\x7a\xc3\x11\x80\x53\x41\xa5\x5e\x36\xd0\x2b\x05\x10\x4d\x05\x42\x04\xb8\x08\x2c\x8d\xf8\x17\x2b\x76\x2a\x33\xbb\x98\x5b\x42\x1e\x2e\x70\x94\x14\x9b\xa2\xf2\x0b\x94\xec\xe5\x56\xa3\xd8\xcb\x43\x27\x8f\x34\x53\x25\x53\x4a\xe7\x6c\x33\xce\x46\x60\x94\x47\xdc\x9c\xb2\xf2\xb0\x22\x14\x7f\xcf\xb7\x2e\xff\xd8\x8f\x55\x74\x22\xd6\xe6\x1c\xac\xac\x87\xc9\x36\x5f\x38\x26\xc2\xac\x5a\xa5\x42\xaa\xba\x44\x96\x1c\x58\x35\xca\x64\x1c\x63\xb5\x52\xa1\xa2\xa8\x5a\xa9\x52\x01\x53\xad\x2c\x51\xc1\x51\xad\x2c\x13\x79\x10\xab\x95\x15\x00\xf7\xc8\xef\x2a\x80\x03\x0b\xab\xab\x00\x6e\x90\xcf\x35\x00\xfb\x24\x53\x1d\xc0\x5b\x24\xbb\x55\x00\x1b\xe4\x77\x05\xc0\x43\xf2\xbb\x06\xe0\x11\xf9\x35\x00\xbc\x43\xe0\x0c\x00\x87\x16\x56\xcb\x3a\x80\xdb\xe4\xbb\x0c\x60\x93\xfc\x56\x00\x7c\x8d\xfc\x56\x01\xec\x90\xdf\x25\x00\x8f\x09\x1c\x80\x27\xe4\xc7\x00\xf0\x9c\x64\x53\x65\x2d\x7d\x60\xed\x2b\xcd\xed\x9d\xbd\x8e\x02\x95\x4e\xe3\x61\xc7\x6e\x37\x6c\x05\x2a\xbb\x8d\xad\xc6\x46\x47\xe9\xc2\xdd\xab\x76\x30\x99\xd9\x06\x3e\x72\xa3\xda\xfb\xb8\x99\xc9\xce\x01\xc4\x1e\x26\x76\x06\xdb\xce\x31\xb2\x90\x78\x63\xc1\xae\xdf\x47\x67\x96\xcf\x3e\x7a\x47\xae\xd7\xdf\x0e\xfa\x28\xb2\xf6\xbb\x7c\x47\xd4\x8d\x70\x13\xa3\x63\x1a\xa2\xf8\x54\xd7\x5f\xb2\xcb\xd3\x22\xec\x84\xb8\x50\x50\x63\xe0\x5d\x12\x60\xf1\x08\x46\xbf\xc8\x42\x5a\x70\xea\xa3\x50\xec\x4f\x89\xe1\x79\xdf\x45\xa7\x70\xd7\x22\xa8\x0e\xd0\xc3\x16\xdd\x96\x81\x8f\xf9\xf7\x23\xfe\xbd\x69\x45\x64\xf9\xb0\x11\x1c\x0f\x47\x18\xf5\x77\xf1\xb9\x87\x54\x44\xb7\x5c\x01\xbc\x6b\xa9\x3a\xf4\xf8\xee\x97\x1b\x0d\x3d\xe7\x1c\xa8\x9b\x5a\x9f\xbf\xc2\x96\xa5\x84\x4e\xdf\x0d\xd8\xe1\x19\xc1\xfa\xf2\x52\xe9\x1d\xa1\xde\x93\x83\xe0\x2c\x09\x84\x6d\x92\xcf\x21\xdf\xc9\x09\x22\x97\x10\x94\x64\x34\x14\xef\x35\xf7\x90\xd5\x91\x9e\x9d\x58\x17\x07\x4e\xef\xc9\x20\x24\xcb\x4a\xb3\xb5\x7e\xa2\xd1\xee\xf1\xb8\x6e\x6f\xbc\x76\xbb\xdd\xda\xdb\xde\x34\x89\x50\xc2\xd7\x9e\x31\x24\x50\x37\xc9\x38\x62\xd3\xa1\x9c\xac\xd5\xde\x6c\xb4\x77\x49\x1a\x57\xac\x57\x09\x08\x50\x37\x05\x74\xdb\xe9\xbb\xa3\xc8\x54\x53\x3b\x00\x91\x76\xa7\x73\x77\xab\xe9\x0f\x47\x62\x1f\xef\xf2\x32\x05\x90\x8d\x06\x85\x42\x6b\x5d\xd5\xe1\x09\x21\x28\x8d\xa8\x4b\xb9\x03\x15\x01\x82\x43\x4f\xc6\x41\x44\x6d\x02\xd8\x0b\xbc\x40\x46\x7b\xa3\xb5\xd5\x6a\x53\xb1\xc0\x89\xf9\xed\xa6\x46\xa1\x00\xe4\x2d\x60\xde\x85\x87\x5e\xe0\x60\x92\xef\x88\xe5\xbb\xb1\xbb\x4b\xcf\xa1\x08\x79\x69\x1c\x80\x87\x81\x4f\x21\xee\x31\x88\x5b\x81\x8f\x69\x89\x1e\xc2\x18\x85\xbb\x43\xa7\xe7\xfa\x03\x02\x70\xca\x00\xb6\xe4\x70\x92\x4f\x0a\x10\x40\xd6\x0f\xcf\x3d\x64\xde\xb5\x2c\xcb\xd3\x36\x9b\xbb\x3b\x5b\xf6\x23\x6d\xab\xb9\xdb\x79\xdc\xec\x34\xee\x12\x22\x0c\x78\x5e\x02\x96\x94\x48\xed\x4b\xa8\x2a\x5b\x3d\x44\xce\x13\x52\xe4\x9e\x00\xe3\x61\xb4\xb8\xf8\x03\x1e\x3b\xe1\xc0\xf5\x09\xe0\x06\x03\xbc\x4b\x03\x28\xfa\x01\xc1\x07\x9f\xcb\x67\x6f\x9b\x1a\x0f\x04\x30\x38\x41\xe1\xa1\x17\x9c\x9a\x25\xc3\xb2\xac\x03\x36\x12\x5b\x87\x6a\x3c\x40\x01\xc1\xb2\xcf\x72\x6d\x71\x60\x52\xba\x48\x08\xcc\xbe\xd6\xba\xdf\x68\xdf\xda\x6a\x3d\xd0\xee\x34\x37\x37\x1b\xdb\x71\xa6\x0f\x42\x67\x48\x90\xba\x95\x4e\x4e\x82\xe5\x2c\xc8\xf7\x7a\xfa\xd3\xdc\xd4\x4e\x83\xb0\x4f\x21\xe1\x90\x6d\xd3\x90\x9c\x1a\x62\x9b\x93\x86\xd0\xfa\x89\xc1\x61\xb6\x21\x46\x67\x78\x13\xf5\x82\xd0\xa1\x01\xaa\x0e\x8f\x18\x7c\x27\x15\x41\x93\x11\xd8\xdd\x23\xa7\x1f\x9c\x12\xb8\x3b\x09\x1c\x0b\x24\xf8\x25\x20\x0c\x9c\x5a\xa5\x1c\x06\xe1\x31\x49\x31\x4c\x52\xc4\xe1\x22\x51\x12\x00\xb1\x9c\x66\x9b\xa7\x91\xe0\x01\x3c\x71\x23\xf7\xc0\xf5\x48\x13\xa9\x3a\x6c\x32\x90\xfb\x71\x20\xc9\x33\x01\x01\x90\x90\x25\xee\x16\xaf\x31\xe8\x07\x22\x8c\x00\xc7\x00\x00\x7e\xbc\x49\x5a\x93\x00\x76\x18\xe0\x87\x69\x00\x50\xdb\x8b\x96\x75\xa8\xed\xb4\x76\x9b\x9d\x66\x6b\x5b\xdb\xed\xd8\x9d\xe6\xc6\xfa\xa6\xc6\x13\x28\xce\x08\x07\x0a\x18\x73\xe6\x1c\xc5\x08\xa3\xbe\x0a\x0a\x85\xf8\xec\x36\xae\x9c\xa5\x1c\x3b\x38\x74\xcf\x54\x83\xaa\x9e\xd0\x27\x50\x08\x63\xcc\xed\xf8\x6c\x2e\xda\x21\xdc\xee\x9c\x30\x01\xd2\xfb\x5b\x84\x35\x03\xca\xdd\x28\x9b\xdb\x61\x40\x0f\xad\x9d\x84\xfb\x0b\xf1\x45\x0e\x62\x7b\x9b\x24\x95\x34\x55\xd0\xe9\x84\xda\xef\xda\x18\x87\xee\xc1\x08\x23\x95\xcb\x2c\xa0\x50\xc8\x99\x40\x68\xdc\x3a\xff\x35\x75\xcb\xb2\x1e\xae\x4f\x81\xed\x24\x53\xcb\xba\xf4\x6e\x1a\xa6\x84\xd0\xfe\xc3\x92\xd1\x4d\xb0\x28\x1a\xe3\xb1\xd2\xbc\x7b\x9b\x73\x79\x36\xa6\x0a\x05\xa4\x39\xfd\x7e\xe3\x04\xf9\xb4\xee\xc8\x47\xa1\xaa\x78\x81\xd3\x57\x64\x63\xf1\xba\x76\xc0\x0e\xd7\x54\x1d\x1e\xcb\xa7\x6d\x40\x45\x70\x17\x3e\x06\xb0\xae\xf5\x46\xe1\x09\xea\xd7\x73\xe1\xd8\x56\x23\x50\x45\x3e\xb0\xce\xdb\x8d\x71\xf3\xcc\x27\xe7\xb1\x63\x4e\x47\xf7\xd8\x19\x20\x6b\x8b\x09\x5d\xcc\x94\x89\x15\xc2\x79\x77\x88\x48\xc3\x3b\x82\x81\x33\xb4\x66\x21\x4a\x39\x7a\x7e\x15\xd8\x94\xff\x02\xb5\x90\x70\x80\xc9\x1c\x28\xea\x32\x15\x22\xaa\x33\xad\x59\x42\xa6\x71\xcf\x1d\xee\x38\xf8\x28\xca\xd1\x2c\x21\xbd\xce\xb6\x24\xd9\x65\x5d\x7a\xd7\xe4\xc4\x2a\x30\x93\x3d\x7d\x09\x01\xc1\xc8\x16\x2d\x4b\xe2\x8d\xf7\x9b\xbb\xcd\xfa\x56\x63\xdd\x26\xd2\x74\xcf\xc1\xea\x3e\xad\xe8\x8c\xcd\x68\x5e\x5f\x99\x30\xa0\x0b\x4c\x3b\x56\x6c\x71\xa3\xa6\x7f\xcb\x0b\x4e\xaf\xd0\x8d\x71\xa3\x76\x10\x88\x99\x97\x0c\xde\x45\x1e\x4c\x67\x02\xd7\x1f\xc8\x61\x62\x73\xd4\x3b\x17\xd2\x07\x19\xf0\x52\x91\x94\x2d\x79\xb3\xf5\x71\x16\x55\x1d\x46\xa4\x7e\xd8\x71\x7d\xd1\x66\x8c\x28\x7c\x2a\x86\x09\x3b\xd8\x6e\x6d\x37\x40\xa1\x20\x13\x8e\xcd\x4a\x37\xf5\x54\x68\xc2\xfd\x2c\xcb\x6a\x32\x3a\x36\xb7\x9a\x9d\x47\x82\xa4\x12\x82\x79\x35\xb8\x82\x42\xac\x10\x31\x8b\xe4\x31\xc6\x14\x36\xf9\x80\xed\xc6\x96\xdd\x69\xde\x97\x51\x79\x0f\x11\x90\x72\x15\xcd\xf6\x42\x79\x52\xc1\x66\xd1\xb2\x46\xda\xad\xad\x96\xdd\xa1\x14\x97\xf2\x92\x7a\xc6\x7c\x83\x49\x61\x68\xc9\xc6\x80\x94\x83\x34\x31\xbc\x98\xc9\x65\x66\xde\xc8\x25\xd7\x03\x17\x1f\xb1\x89\xea\xca\xbe\x2d\x77\x53\xd1\x8d\x59\x11\x6c\x26\xd3\xc8\x44\x96\x1a\x32\x44\x68\xda\x42\x27\xc8\x9b\x99\xf7\xcb\x74\xe1\xe6\xf6\x56\x73\xbb\x01\x2e\x2f\x5f\x3e\xd1\xe3\xfa\x56\x6b\xe3\xb5\x77\x97\xf4\xd6\x56\xe3\xe1\xbb\x4b\x79\xbb\xdd\xdc\x7c\x77\x29\x93\xc9\xfb\x5d\x25\xef\xd8\xf5\xad\x06\x98\x6a\x8a\xba\x17\xf4\x9e\xb4\x42\xf6\xd1\x71\xe6\xf1\x96\xf7\x97\xc4\x02\xdf\x69\x6d\xbd\x5d\xba\x9a\xdc\xb2\xa6\x3d\x71\xc8\x8b\x1e\x7b\xf6\x5a\x53\xdb\xbd\x7f\x7b\xf7\xfe\xed\x78\xb1\x94\x4a\x97\x8a\x13\xda\x74\x64\x75\xf3\xf0\xee\xd6\x2e\x0a\x5d\xc7\x73\x3f\x8e\xc2\xd8\xa6\x5c\x23\x42\x43\x93\x4c\xd5\xaa\xd2\x77\xb0\x63\xd2\x69\xfb\x7a\x74\x32\x28\x9e\x1d\x7b\x50\x29\x22\xbf\x17\xf4\xd1\x5e\xbb\x49\x56\xae\x81\x4f\x26\x01\xac\x45\x22\xa3\x0e\xb7\x97\x56\x6d\x00\xc0\x98\x6f\x49\xda\xb1\xe8\xcf\x54\x0b\x89\xf4\xc2\xd5\x05\xed\xbc\x82\x43\x32\x4b\x11\xc6\xb0\x1b\xf6\x2e\x2f\x43\x2d\x0a\x7b\x5c\xe3\x70\xc3\xde\xbe\x6f\xef\xb2\xc4\x7e\x36\xf1\x06\x75\x93\xa3\xfa\x1c\xb6\x79\xab\x6d\xdf\x6d\x30\xd8\xba\x45\xd5\x84\x24\xd9\x8d\xd4\xad\x24\x79\xd7\x29\xb9\x3e\x46\xa1\xef\x78\x25\xf7\x30\x74\x8e\x51\xe9\x09\x3a\x57\xa8\xdc\x58\x17\x7e\x4d\xea\x63\x89\xff\xbc\xe7\x7b\x6f\x28\xee\x4f\xf9\xca\x49\xfa\xa2\xa5\xda\x05\x44\x35\x33\xfa\x2e\x6b\xde\x7c\xc8\x64\xd3\xd8\xbe\x66\x17\xd1\x35\x96\xa6\x17\x0c\xcf\x37\x76\x77\xe9\x9a\x30\x5b\x44\xb2\xa9\x67\xc7\x0a\xb8\x35\x7c\xd3\xd2\x6b\xb8\x54\x12\xfb\x7a\xb6\xe6\x62\x74\xac\x62\x50\x53\x7a\x4c\x1b\x49\x59\xb4\xac\x90\x88\x9e\xac\xeb\x47\x08\xc7\x15\x0d\x21\x25\xb8\xf8\x66\x87\xa3\x21\x88\xa5\x27\x44\x50\xda\xbd\x6b\x6f\x6d\x3d\x6e\xde\xb5\x6f\x37\x2c\xb9\xb3\x0d\xdc\xc3\xda\x81\x13\xa1\xe5\x2a\x6c\xeb\xde\xed\xd6\xa6\x77\x64\xdf\xb3\xeb\x76\xd3\x66\xff\xed\x5c\xbf\x7e\xfd\xfc\xce\x52\xdd\x6e\xd0\xcf\x2d\x16\x5a\xb7\xe9\x77\xb3\xde\xb6\xed\x15\xe5\x55\x69\x75\xc6\xbb\x1e\xb4\xab\x5a\x53\xc1\x29\x8d\xce\x38\xb4\x8d\x86\xc8\xc1\x53\x1a\x9f\x71\xbc\x98\x76\x72\x63\x07\x22\xd6\xf5\x07\x76\x88\x9c\x19\x40\x8e\xeb\xe3\x1c\x88\xdb\xa1\xd3\x77\x91\x8f\x93\xc2\xb2\x6a\xa3\x53\x31\xc9\x7e\xcf\xe3\x56\xbb\x79\xbb\xb9\x9d\x0e\xdb\xd8\x6a\xee\xa4\x43\x76\x9b\x1f\x6e\xa4\x43\xda\x8d\x9d\x86\xdd\x49\x6b\x96\xba\x2a\x56\x75\xaa\xf4\x44\xde\x0c\xaa\x6e\x49\xde\x2a\xe4\xd5\xa1\xaf\x2b\x80\xea\x0a\xa8\x65\xb6\xbd\x6a\xac\x48\x7a\x98\xee\x4b\xe9\x61\xf6\x72\xf1\xb9\x60\xbf\xa6\x0e\xb7\x5b\x3c\xcc\x34\x20\x7b\x79\xfc\xd0\x2c\x8b\xd7\x47\x66\x65\x0c\xbd\x9c\x4a\x5e\xd8\x7b\x9d\x96\xa9\xc3\x8d\xd6\x76\xc7\x6e\x6e\x9b\x06\xdc\x20\xf2\xb8\x59\x86\x4c\xe9\x9e\xa4\x1b\xe5\x90\xeb\x82\x6d\x86\x3d\xae\xb7\xa8\x3a\xbe\xbd\xb9\xd9\xdc\xbe\x4d\xbf\x0c\x9a\x57\x63\xbb\x43\xbf\xca\x63\x78\x2f\xb7\x05\x46\x92\x73\x10\xa6\x17\xcd\x99\xeb\xfb\xb2\xf1\x2a\x38\x37\x67\x51\x0a\xd3\x59\x8f\x48\x77\xf1\x34\x4e\x8b\xda\x41\x88\x9c\x27\x35\x0e\x77\x82\xc2\x2c\xd4\xfd\x46\x5b\x86\xa1\x5b\x02\x29\x10\x42\x5b\x0e\x21\x5a\x53\x52\xef\x4f\x9f\x80\x20\x32\xf5\xef\xa5\xd5\x7d\xd2\xfd\x38\x5f\x21\x46\x87\xbe\xa5\x43\xc7\xb2\x69\xa1\x84\xbf\x3b\xfb\x7a\x97\x61\x60\x25\x95\xb9\xbc\xcc\x06\xdf\x6f\xb4\xc5\xb1\x1c\x66\x47\xa9\xd7\x31\x3f\x0e\x84\x81\xc5\x35\x5b\xaf\x0b\xcd\x56\x31\x33\x45\x37\x82\x45\x4b\xcd\xcb\x6b\x3d\x7d\x38\xc4\xf3\x84\x22\xef\x80\x9d\x4c\xca\x00\x2c\xe7\x6b\x01\xc4\xb1\xfa\x2c\x2f\xc5\x89\x95\x3f\x0b\x05\x35\xb4\x92\xcf\x69\x05\x15\x9e\x3f\x19\x71\x29\xa4\x08\xed\x0b\x05\x87\x7a\x16\x92\xc3\xd6\x09\x4f\x62\xc5\x99\xb9\xb1\xe1\x75\x5e\xf7\x6b\x69\x38\x81\x8e\x6f\x25\x9f\x79\xe8\xf0\xaa\xe4\xe3\xa3\x86\x96\x1f\xd3\xf4\x1a\x12\xaa\x32\x69\xca\x08\x7d\xc5\xab\x58\x5e\x9e\x5f\x32\xd6\x0d\x60\x68\xe1\x98\x66\xeb\x78\x0e\xf9\x04\x0a\xa6\x50\x65\xf6\x2d\x1c\x57\x6f\x1d\xcf\xa9\x69\xac\xf3\x6c\x4a\x45\x85\x66\xb6\xc3\xe4\x55\x8d\x84\x9d\xaa\x7c\x0f\x0d\xc0\x41\x7e\xaf\x4f\xcf\x00\x73\x35\x35\x47\x9a\xc4\x8e\x64\x61\x38\x57\x73\x0e\xa8\x36\x3f\xec\x1c\x69\x32\xe7\x4a\x1f\x76\xa6\x33\xc8\xee\x3d\xd8\x64\xb8\xbe\xd0\xe4\x36\x4b\xd9\x71\x56\xfe\x80\x6e\x28\x89\xd3\x6f\x9b\xd7\xf0\xde\x74\x0d\x17\x50\x8d\x47\xc9\x0c\x97\x9f\x61\xed\x07\x71\xd5\x76\x9b\x9b\x8d\x5d\x8d\xaa\x78\xcd\x6e\x7f\xaa\xff\x96\x4d\xc3\x14\xcf\xe6\x24\x72\x73\x12\x75\x5a\x3b\xf3\x92\xf4\x72\x92\xb0\x13\xe7\x39\xa9\x52\x3a\xbd\xdc\x1c\x41\xf5\x99\x6a\x43\x1d\xfa\x54\x97\xc1\x85\x3e\xd7\x08\xa9\x97\x1c\xe8\x0b\xcd\x06\xb7\xc4\x65\xed\x85\x7b\x73\x1a\x7b\xc1\x9f\xd1\x9c\x89\x24\x33\x43\x7f\x3f\x7d\xae\x62\xe7\x2a\xdd\x61\xa1\xaa\x22\x88\x60\xe7\xea\xda\xe1\x58\x1b\x23\x66\x22\x33\x90\x92\xc4\xaf\x29\x65\x0b\x3f\x1e\x1d\xb6\x16\x52\x38\xde\x85\x7a\x5a\x2c\x17\x70\xdd\xcd\x34\xee\x54\xcc\xa6\xd9\x73\xd2\x72\xd5\x1d\x16\x14\x32\xfd\x25\xed\x1c\x30\x76\x35\x27\x5d\xd1\x17\xf5\x7c\x0f\xd3\x0b\xe2\x14\x5f\x22\xa3\x2b\x33\xe8\xd6\xd2\x94\x79\x74\x25\x65\x42\xae\x4f\xa3\x9d\xa5\x32\xa7\x5d\x70\x1e\x42\x49\xba\x22\xce\xa9\xdd\x1f\x9e\x9e\x57\xee\x25\x32\x9a\x9b\x41\x4c\x99\x44\xae\x7c\x97\xa4\x79\xa1\xf6\xba\xa2\x7a\xef\x69\x1e\x45\x69\x8e\x7e\xd7\x95\x91\x32\xe9\x66\x8c\xf1\x5e\x6a\x58\x5d\xd9\x5e\x73\x86\xc4\x1f\x96\xf6\x45\x3b\x4c\x2e\xd2\x99\xce\x32\x1e\x4f\xaf\x27\x73\xd7\xf2\xd2\x79\xfc\x06\x3d\xa6\x26\xc5\x86\x92\xb6\x5a\x26\x1e\xc0\x83\xf4\x02\xd5\xec\x33\x1d\x2b\x09\xce\x73\x87\xe6\x20\x9d\xd4\x73\x87\x32\x48\x2b\x74\x07\xae\x6f\x6e\xa4\x80\x58\x60\xda\x1c\x21\x61\x9d\xc2\x68\x94\x4d\xcb\xa5\x83\xe0\x2c\xb6\x1a\x4d\x09\x0d\xb5\x78\x19\x81\x7c\x9c\x01\x93\xa6\xe5\x71\x1c\x98\x4c\xe3\x63\x00\x37\xac\x97\x2c\xfb\xde\x8b\x95\x7d\x2f\xaf\x6c\x59\x84\x18\xc3\x7e\xae\xf8\x78\x98\x22\x11\xa5\x38\xd0\x8e\x9d\xa1\x2a\xe3\xe9\x1e\xaa\xca\x28\xf4\x14\xcb\xb2\x6c\xed\x18\xe1\xa3\xa0\x9f\x58\xb5\x26\xbb\x5e\xb6\xe6\x84\x83\x68\x5f\xef\x82\x1a\x7b\xb5\xf0\xfa\x3e\xee\x9a\xfb\xdd\x71\xec\x81\x18\xc0\xd0\x92\x4b\x14\xb3\xad\x16\x0d\x3d\x17\xab\x0a\x54\xc8\xf2\x5a\x86\x60\x53\x9f\x1c\x5f\x4f\xc5\x13\xc9\x58\x8a\x4d\x5c\x1c\xa7\x6b\x91\x54\x59\xad\xef\xa3\xee\xe5\x25\x97\x46\x35\x1c\xba\xc7\x2a\x10\x39\x2c\x28\xac\xfa\xb7\x98\x26\xd5\x0b\x40\x36\x44\x91\x17\x51\x30\x0a\x7b\xc8\xb4\x21\x9b\x85\xcd\xbc\xa6\xe6\x99\xf0\x16\xf7\x83\x12\x83\x8d\x1b\x52\xe2\xbf\x35\x6e\x99\x4c\xe2\x4b\x67\xb1\xa1\x32\xf9\x5c\xc8\x4b\x28\x26\xfb\x54\xba\x73\x9e\x2e\x4e\xb0\x30\x2b\xdd\x23\x39\xdd\x54\xf4\x38\xfb\xad\x2a\xcc\x79\x6b\x72\x16\xec\xef\xa3\xee\x3a\x79\x98\x3e\xe9\x03\x90\xac\x4b\x4c\xe1\xce\xf8\x46\x79\x7d\x9f\x2c\x1b\xe0\x5e\xd7\x64\x2f\x64\xa9\xd1\x4d\x54\x15\x1c\x09\x90\x2c\xa4\xe8\x6a\xaa\x6b\x8a\x77\xa3\xdb\x1d\x8f\xc1\x18\xde\xca\x31\x49\x61\xed\x43\x3a\xe7\xfa\x9e\xc9\x96\x1a\x36\x18\xc3\xc6\xbc\xb1\xc6\x14\x76\x05\x51\x09\x6f\x4b\x19\x89\x27\xcb\x74\xc5\xd0\xf5\x0f\x28\x7c\x47\x96\x30\x46\x9e\x06\x07\xc3\x59\x29\x12\x78\xb6\x43\x30\x03\x4a\x49\x4e\x62\xd3\xaa\x91\x60\x0c\x0f\xad\x19\xdb\x75\xd3\xc6\x83\xd7\x3f\xf2\x7a\xf4\x27\xd7\x21\xf7\x50\xbd\xdf\x85\xbe\xa5\x28\xb0\x6e\x51\x8d\x19\x87\xbc\x47\x96\x0e\x03\x4b\x87\xae\x35\x75\xa6\xab\x28\x35\xea\x1c\xfa\xe2\x83\xca\x07\xa9\xbf\x00\xee\xc6\x40\x87\x06\x28\x14\x54\x27\x09\x31\xa0\x68\xa1\x52\x99\xac\x75\x0b\x85\x50\x78\xaf\xe6\x5d\xba\xc6\xf0\xf1\x63\x85\x19\xa5\xa4\x40\x03\x14\x8d\x9a\x52\x22\xad\xe3\xa7\x33\x47\x37\xf5\x42\x41\xb5\xe5\x60\x04\xd2\x8e\x62\xa1\x9f\xc4\x22\x00\xa0\xe2\x07\x3e\x52\x16\x2d\x4b\x25\x11\x29\x50\x50\x28\x70\x6f\xda\x17\xc3\x10\x1d\xba\x67\xa6\x0d\x19\xa7\x32\x7d\x48\x78\x11\xf5\xab\xce\xe9\x43\xa8\x92\x78\x84\x17\x03\x5a\x01\xda\x61\x10\x36\x9c\xd4\x96\x14\x65\x7e\xfa\xa2\x65\x45\x97\x97\x8b\x48\xc3\x28\xa2\x8e\xc2\x33\xdd\xe9\x83\xca\x07\xcd\xfa\x7a\x9d\x74\xc1\x42\x41\x65\xb4\x07\x66\xdd\xb2\xe5\xed\x22\x55\x31\xe9\x66\x3c\x0b\x22\xd9\x5a\x96\x15\x89\xbd\xf9\x93\xc0\xed\xab\x91\x65\x80\x5a\x50\x2c\xca\xc9\x40\x36\x99\x41\x93\x5d\xf0\x0c\x02\x91\x01\x69\x65\xba\x5b\xe9\xaa\xa0\x16\x94\x4a\x63\x29\x0f\x78\x65\xd1\x34\x95\xc8\xbc\x50\xa0\x39\x17\x0a\x8b\x3e\xf7\x47\x7c\xfd\x23\xa3\xd0\xfb\x93\xeb\x6e\xec\x22\x3d\xdb\xf8\xb4\x68\x95\x10\x16\x8c\x69\xe6\xeb\x7e\xd1\xb2\x4d\xa7\x68\xd9\xe3\x31\x80\xae\x0a\x20\x7e\x05\x27\x0e\x3b\x76\xe7\x8e\x75\x71\xbf\xb1\xd1\x69\xb5\x4d\x1d\xd6\x1b\x1f\x6e\x36\xda\x8f\x37\xf6\xda\xf7\x1b\xa6\x01\x37\x9a\xed\x8d\xad\x86\x59\x7e\x35\x6a\xc6\x16\x56\x97\xe5\x53\xb0\xb4\x82\xe9\xfb\xef\x89\x24\xa4\xd4\xd0\x18\x31\x58\xf8\x99\xb0\x99\x3f\xb7\xf0\xab\x72\x13\x11\xeb\xe9\x59\xd9\x00\x52\x25\x0b\x31\x1d\xa7\xdd\xce\xa3\xad\x06\x73\xe8\x92\x0a\x11\xc7\xfa\xe9\x8d\x76\xaa\x97\xec\xcf\x80\xbc\x68\x6e\xef\x36\x37\x1b\xa6\x0e\x5b\x7b\x1d\xfa\x66\x8c\x61\x3d\xa7\xa0\x8b\xed\xd6\x76\xc3\x2c\x19\x70\xb3\xb9\xbb\x61\xea\xa2\x3b\x18\x70\xf7\xde\x9e\xdd\x6e\x98\x65\xb8\xd9\xd8\x68\xde\xb5\xb7\xcc\x0a\xdc\xf8\xd0\x6b\x8f\xc5\x57\x55\x84\x3f\xde\x6a\xd8\x54\xf6\xfa\x70\xa3\xdd\x32\x97\xe0\x56\xeb\x41\xa3\xfd\xb8\xdd\xba\x6b\x6f\x9b\xcb\x70\x6f\x67\x27\xfe\x5a\xe1\x71\xb7\xdb\x8d\xc6\x6b\xe6\x2a\xff\xb2\xb7\x76\xee\xd8\xe6\x1a\x87\x64\x5f\x86\x0e\xed\xb6\x5d\x6f\x6e\x3c\x6e\x6e\x6f\x36\x37\x4c\xc3\x80\x76\xfb\x6e\x63\xbb\x69\x6f\x9b\x46\x19\xd6\x1b\xdb\xb7\xed\xad\xa6\x69\x54\xe0\x86\x7d\xb7\xde\xda\xa4\xe1\x55\x8a\x5f\xc3\x6e\x77\xee\x6c\x3d\x7a\x5c\x6f\xdb\xdb\x1b\x77\x4c\x63\x89\x86\xde\x69\xd8\xf7\x1b\xdb\x5b\x8f\x1e\xef\x76\x1a\x77\x4d\x63\x99\x06\x36\x37\x1b\xad\xdb\x6d\x7b\xe7\x0e\x29\x61\x05\x6e\x36\xee\xdb\xdb\xf6\x6d\xbb\xdd\x34\x8d\x55\xd8\xe8\xdc\x69\xb6\x76\x9a\x1b\x8f\xb7\xf7\xee\x36\xda\x04\x62\x0d\xde\x6e\xb4\xda\xb7\x49\x59\x65\x1d\xde\xde\xfb\x90\xdd\xb6\x3b\x4d\xb3\x6c\xc0\xdb\x7b\xed\xbb\x7b\xaf\xdd\x69\x9a\xe5\x32\xbc\xd3\xa8\xb7\x1b\x0f\xe8\x5b\xb3\x6d\xdf\xb6\xb7\x6d\xb3\x5c\x89\xdf\x1f\x37\xdb\xad\x3b\xb6\x59\xae\xc2\x0f\xd9\x3b\xf6\x76\x63\xb7\xf1\xf8\x56\xab\x4d\xe8\x59\x5e\x4a\x82\x9a\xdb\x22\x70\x19\xbe\x66\x6f\x6f\xdb\x9b\xb6\x59\x5e\x81\xaf\xd9\x1d\xfb\x35\x9a\xe1\x6a\xfc\x2e\x32\x5c\x83\xaf\xdd\xb9\xdb\x68\x9b\x15\x1d\xbe\xd6\x6a\x37\xec\xed\xc7\x77\xec\xed\xdb\x7b\x5b\x22\xfb\x8a\x21\x85\x7f\xc8\x8e\x83\xcb\xe9\xe0\xb8\xe4\x4a\x05\x6e\xd9\x2d\xb3\x52\x15\xad\x24\xc8\x5f\x59\x82\x77\xed\x2d\xfb\x91\xbd\x65\xdf\x35\x2b\xcb\xf0\x6e\x6b\xfb\x76\x6b\x8b\xc6\xac\xc0\xbb\x8f\xec\xed\xbb\x76\xdb\xac\xac\xc2\x56\xbb\xf9\xc8\x36\x2b\x6b\x70\xa7\xd1\xde\x25\xd1\x55\x1d\xee\x36\xef\xee\x3c\xde\xb8\xd3\x94\xeb\x5d\x35\xd2\xc1\x31\x06\xd5\x32\xec\xd8\x77\x9b\x5b\x66\xb5\x02\x3b\x8d\xad\xbd\xdb\x7b\x66\xb5\x0a\x3b\x77\xec\xa6\x59\x5d\x82\x9d\x66\xbd\xd1\x21\xb9\x2e\xc3\x4e\xdb\xde\x9c\xca\x75\x25\x1d\x9c\xe4\xba\x2a\x3a\x9a\xa8\x50\x75\x8d\x76\xfd\xad\xd6\xee\x5e\xbb\xf1\xb8\xb5\xd3\xd8\x36\x97\x74\x39\x88\xfc\x36\x36\xcd\x25\x63\x0c\x9d\xfc\xe1\x3b\x47\x84\xea\xbb\x51\x2f\x16\x6e\xea\x1a\xc9\x96\x2f\x50\xdc\xb0\xe7\x21\x29\x8a\x0d\x3c\x16\x19\x7d\x6c\xe4\x84\x72\x24\x1b\x8c\x2c\xb2\x8f\x7a\xee\xb1\xe3\xc9\xb9\xb2\x91\xc8\x33\xfe\xe8\x93\xd2\x34\x88\x34\x74\x53\xb9\x94\x3c\xe4\xd0\xf5\xd4\xc7\x51\x18\x4c\x67\x99\x1a\xdc\x5c\xbc\x23\xf2\x44\x29\x0c\x8e\x1d\x5f\x82\x97\x46\x3d\x03\x1b\x0d\x87\x39\x60\x12\x3b\x90\x73\x1b\x84\x08\x3d\x99\xca\x8d\xf2\x09\x19\x8c\x5e\x36\x34\x05\x46\x59\x86\x5c\x68\x16\x4c\xe2\x2c\x5c\xe2\x0c\x9d\x03\xb7\x57\x72\xfd\xbe\x2b\x37\x8e\xcc\x72\x04\xe0\x31\xf2\xdd\x54\x0d\x44\xbf\x61\x00\x07\xc8\x1f\x38\x9e\x2b\xc5\x73\xde\xc4\xdb\xc2\x39\x3e\x08\xfa\xe9\x0c\x62\x8e\x95\x34\x17\x72\x42\x7c\xe4\x9d\x97\x0e\x42\xc7\xef\x1d\x65\x5a\x2d\xcd\xd0\x92\x44\x47\xc8\x39\x41\xbe\x77\x5e\x8a\x30\x3a\xce\xa4\x49\xb1\xbb\x24\x89\xdb\x47\xc1\x20\x74\x86\x47\xa9\x6a\x67\x58\xa1\xe8\x1e\x27\x8e\xef\x0c\x9c\xd0\x4d\x75\x0a\xc1\x21\xb9\x67\x28\x7c\xe4\x06\x43\xb7\x57\xa2\x76\x3f\xa9\x4c\xb3\xec\x93\x25\x18\xa0\x20\x1c\xa4\xc9\x21\x78\x2a\x07\x18\x7d\xd4\x09\x1d\x2c\x17\x2a\x18\xad\x00\x08\x8f\x47\x4f\x8e\xd2\x00\x8c\xfb\x32\x80\x23\x74\x10\xa2\x53\x29\x9a\x31\x64\x1e\xe9\x86\xce\xc0\xf1\xe5\xce\x21\x38\x73\x1a\xa0\xe4\x86\xc1\x51\x1e\x18\xe3\xb7\x0c\xf8\xa3\xce\xd0\xf1\x51\x84\x4a\x54\xa3\x55\x1e\x6d\x19\xe6\x9e\x01\x77\xfd\xd9\x09\x04\xa3\x62\x49\x9e\x38\xbe\xef\xf4\x65\x3c\xf8\x74\x20\xa2\xb1\xf3\x24\x5d\x1d\x31\x2f\xa4\x01\xa6\xaa\x93\x9e\x3e\x38\xf0\xd1\x31\x0a\x65\x18\x32\xa1\xf0\xa8\x20\x44\x8e\x5f\x3a\x72\xfc\xc1\xc8\x9b\xae\x6e\xde\x8c\x93\x4d\xf8\x51\x67\x5e\xba\x78\x46\xca\x49\x96\x43\xae\xdc\x39\x8b\x73\x0a\x47\x66\x63\x5b\x76\x8a\x6b\xe5\x8c\xe7\xf4\xf4\xc6\x80\x8f\x1d\xcf\x39\x77\x3c\x47\x1e\x56\xf1\xa4\xc7\x41\x02\x7f\x10\x78\xe9\xac\xe2\xa9\x90\x83\x9c\x3b\xfe\xb1\x23\x53\x94\x4f\x8f\x2c\x3a\x08\xdd\x73\xb9\x49\xe8\x84\xc9\xa2\x86\x28\x8c\xd2\x59\xf3\x49\x94\xcf\x0e\xee\xf1\xb0\xd4\x3b\x72\xf3\xfb\x5e\xce\x24\x9b\x93\x2c\x87\xa8\xb9\xd3\x30\x4b\x8a\x9d\x63\x57\x06\xa5\x13\x33\x8f\x42\xde\x68\x30\x92\xe3\xe8\x5c\xcd\x23\x8f\x1c\x79\xa4\x92\xc9\x9b\x47\xb8\x07\x08\xa7\x6a\xc8\x27\x74\x1e\x1d\x3a\xfd\xd9\x35\xcc\x99\xf0\x73\x92\xe5\xd4\x30\x57\x24\x48\xcd\x1c\xd3\xfd\x23\x2d\x2d\xd4\xe2\x49\xdd\x0b\xa2\x51\x88\x4a\xc1\x10\xf9\x99\xf9\x5d\x92\x24\xa6\xc0\xc9\x2f\xea\xe7\x27\x60\x72\x46\x8d\xef\x44\xf9\x48\xc9\x9e\xc6\xd5\x85\x22\x6e\x14\x7b\xd1\x4a\xd6\x15\xd3\x7b\x1e\xaa\x0e\xc3\xdc\xfd\x11\xa0\xe6\x68\x6d\x29\x9e\x1b\xe1\x12\x55\xf1\x2a\x51\xfd\x2c\x25\x76\x1a\x74\xe1\xc9\xd2\x8e\xe9\x5c\x95\x9c\x2c\xb4\x14\x20\x19\x32\xb1\x3d\x6a\x61\x45\xba\x8e\xf6\xf5\xae\xb0\x55\xe2\x10\x62\x87\xd3\x8c\xae\xca\x5c\xec\x85\x29\xe0\x8a\x4d\x6a\xd7\x8f\xdc\x7e\x22\x43\xf9\x1a\x5b\x11\xf1\xc1\x37\xc2\x2c\x36\x7b\xe0\xa9\xf1\xe5\x12\xdd\x47\x7b\xc5\x57\xb3\xfd\xf1\x38\xde\x63\x46\xac\x75\xf2\x5b\x06\xdc\x81\xe9\x1c\xab\xd3\xf7\x77\x5b\x00\x9d\xc5\x5e\xf3\xd2\x46\xa7\xdc\x70\x25\x9c\xe7\x2b\xaf\x83\xce\xf0\x76\xd0\x47\x79\x9e\xf2\x44\xab\x05\x2a\xd2\xfa\x0e\x76\x20\x16\x7a\xec\x29\x5b\xaf\x5a\xca\x9b\x5e\x08\x31\x54\x75\x58\x4f\xcc\xc4\x84\xe1\x0b\x89\xa1\xf6\xe0\xd3\xba\xc5\x0e\xb7\x54\xbd\xae\x7e\xe4\xf2\xf5\xe8\xd2\xbc\x2c\x5d\xbe\xae\x5e\xbe\x0e\x80\xba\xef\x94\x3e\xde\x05\xd7\x07\x30\x98\xaf\x2b\xe2\x6b\x9d\xc6\xc3\xce\x63\xea\x15\x98\xf0\x45\x36\x2f\x6e\xd8\xbb\x0d\x33\xde\x02\x4c\xed\x25\xd6\xf2\x93\x6d\xd8\x3b\xcd\x8e\xbd\xd5\xfc\xb0\x94\x2e\x44\x43\xcf\xe9\x21\x35\x82\xee\xac\x64\x94\xcb\x66\x4b\xdb\x23\x3c\x99\x97\x96\x19\xa7\xf6\x78\x9c\x52\x19\x4c\x29\x1f\xc4\xd7\x6e\xe9\xeb\xa8\x88\xd3\x19\x51\x4b\x98\x57\xb3\xcf\x55\xae\xa4\xee\xf5\xb3\x53\x17\x4e\xd9\xfb\x7a\xb7\x50\x28\x2f\x2d\xd1\x77\xa3\xcb\x76\x0f\xed\xfd\xb2\x14\x5a\xe9\x8e\x61\xdd\xba\x18\x20\xbc\xb0\xbb\xb7\xb3\xd3\x6a\x77\x1e\xb7\xed\xed\xdb\x8d\xc7\xf5\xd6\xde\xf6\xe6\x6e\xbc\x1f\x9d\xd9\x78\xb5\x35\xe6\x45\xb6\xed\xf8\x03\x94\x78\xcb\x93\x02\xd9\xae\x25\xca\x77\xa1\x98\xe8\x48\xb1\x14\xc2\xe6\x47\xa1\xdd\x1f\xa3\x08\x2b\xa0\x26\x7a\x2e\x77\x1f\xa9\x18\xe5\xca\xf0\x4c\x89\x3b\x34\x57\x87\xb7\x94\x03\x2f\xe8\x3d\x51\x20\xf3\xd5\xa7\x39\xc3\x21\xf2\xfb\x1b\x47\xae\xd7\x57\x31\x80\x48\x8b\x90\x87\x7a\x74\xbc\xa8\x58\x10\x0e\xcd\xf4\xec\xc8\xdd\xe6\x89\x33\x66\xe1\x13\x89\x56\x99\xe6\x1f\xa2\xe3\xe0\x04\xc5\xf9\x1b\xe5\x8a\x65\x59\x3e\xdf\x7d\x5d\xd4\x05\xef\x5a\x34\xc6\xaa\x70\x19\x18\x8f\xb6\xfc\x66\xae\x43\x25\x8f\xf4\x71\x83\xdb\x63\x32\xf6\xa0\xdc\x44\xbb\xf7\x6f\x3f\xde\x6c\xdb\x0f\x9a\xdb\xb7\x73\x5b\x88\x6f\xf8\xa3\xd3\x05\x3a\x0d\xc2\x1c\x4a\x33\xdd\x74\x05\xc0\xd0\x62\x96\x62\x81\x4f\x58\x84\xaa\x94\xfb\x0a\x19\xe6\x51\xd8\xb3\xf2\xd4\xf4\x6f\x44\x27\x83\x85\xb3\x63\xcf\x8f\xac\x0f\x1e\x61\x3c\x34\xaf\x5f\x3f\x3d\x3d\xd5\x4e\x2b\x5a\x10\x0e\xae\x97\x75\x5d\x27\xa0\x1f\xbc\x79\x83\xfc\xdc\x54\xe8\x45\x9c\xa1\xd6\x0f\x9d\x53\x76\x16\x89\xa8\xbd\x25\x24\x43\x64\xd3\xc1\xce\x5e\x7b\x4b\x05\xc9\x35\x9a\x31\xf1\x62\x7a\xbe\x0b\x2a\x4a\xd4\x99\x47\xc4\xba\xbd\xdb\x58\xae\x4a\x74\x9c\x79\xe1\x6d\xde\x61\x65\x42\xdc\x70\x0e\x71\x7d\x2b\x9c\x26\xae\xc4\x7b\x77\xc2\xe0\xd8\x8d\x50\xea\x5c\x03\x53\xda\x23\x7e\x75\xa5\x34\x65\x11\x52\xfa\x12\x29\x31\x23\x65\x98\x43\xca\x44\x65\xdf\x56\x17\x8d\xf8\x3c\xcb\x56\x17\x75\x30\xae\x61\x2d\xf0\xbd\xc0\xe9\x5b\x75\x48\x5e\x11\x99\xc6\x72\xee\x6f\x65\x49\xe1\x22\xbd\xbc\x4e\xeb\x05\xc7\x43\x0f\x61\x54\x28\x44\x08\x77\xdc\x63\x14\x8c\xb0\x2a\x5b\x80\xaa\x60\x0c\x97\x74\x1d\x8c\x41\xd2\x68\xd0\x7e\xf1\x66\x4b\xb7\x47\xdc\x72\xd3\x78\xa1\xf1\x98\x4e\xf3\xa9\xd6\xbc\xd5\x6a\x37\x9a\xb7\xb7\x5b\xf5\x0f\x35\x36\x3a\x53\x83\x23\xe7\x4a\x65\x76\xab\x20\x99\x4f\x0b\x85\x9c\xe8\x53\xd7\xef\x07\xa7\xda\x21\xc2\xbd\xa3\xf5\x3c\xcf\xa0\x33\x9a\xbc\xc6\x55\xcb\x2c\x43\xd7\x63\x6f\xb4\xe4\xa3\x26\xce\xe5\xa7\xfa\x03\xd6\x0e\x5d\xcf\x63\x22\x35\xbd\xa5\x4f\x87\x0b\xe5\xa5\x25\xb8\xa0\x03\xc2\xee\x48\x24\xe5\x4e\xd4\x5c\x59\xa7\x7f\xe2\x62\xd3\xa4\x17\x3a\x16\x92\xfb\x41\xad\x4e\x7b\x91\x98\xa4\xa9\x5c\xce\x30\xbe\x15\x84\xc8\x1d\xf8\xac\x39\x76\xef\xdf\x06\x2a\xcf\x93\x9a\x43\xd7\xa5\x73\x7a\x19\x2b\xd4\x9f\x89\x0a\xa4\x99\x93\xfe\x14\x1b\xfd\xf4\x69\xbe\x11\xd0\xf0\x11\xf2\x55\xd9\xc5\x38\x9e\x62\x05\xbc\x26\x94\x09\xd1\x70\x52\x87\x54\x01\x54\x90\xa9\xbd\x30\x3e\xbc\xca\x53\x2d\xd4\x77\x4f\x92\xc1\x17\x1b\xe0\x66\x8e\x71\x95\x51\xe8\xa9\x4a\x91\x5e\x99\x08\xa3\xec\x0c\xa4\xeb\x64\x06\xf2\xd5\x3a\xf5\x34\x90\x5b\xe9\x17\xa6\x74\x04\x80\xc9\x87\xbf\x16\x22\x7a\xd1\x31\x19\x6e\x59\x9a\x49\x3e\xdf\x25\xd2\xd9\x6c\xe8\xfb\xea\x55\x64\x23\x19\x32\x96\x30\x9d\xe3\xa2\x21\x0f\x55\x19\x9b\x28\xf0\x4e\x10\x41\xe7\x85\x07\x6f\xee\xf0\x9b\xc7\x7d\x37\x5a\xed\x5d\x66\xa0\x93\x08\x19\xec\xa8\x89\x1e\x23\x8b\x7e\x0d\xb4\x5e\x18\x44\x11\x53\x11\x7a\x61\x6c\xa4\xcc\xe7\xe1\xd0\x6e\xec\xee\xb4\xb6\x77\xd9\xa9\x54\xc2\x2b\x32\xfa\x13\x2a\x37\x69\xbb\x83\xf1\xb0\x8d\x3e\x36\x42\x11\x06\x84\x46\xc3\xc0\x8f\xe8\xea\xf4\xc5\xa7\x77\xb9\xbc\x2b\x89\xf3\xf0\x4e\x3b\xc1\xe9\xd4\xc5\x47\x1b\x21\xea\x23\x1f\xbb\x8e\x17\x91\x95\xd5\x34\x5a\x2f\x47\x9f\x87\x77\xda\x19\x1c\xc6\x92\x78\x5f\x7f\x45\xa7\x92\x69\xf7\x16\x16\x62\x52\xf9\x66\x63\xa3\xd5\xb6\x3b\xcd\xd6\xf6\xe3\xad\xe6\x76\x63\x3a\x38\x07\x90\x1e\x28\x66\xaf\xed\xa0\xae\x96\xea\x96\x1a\x5a\xfe\x5c\x57\x4b\xf1\x8d\x16\xf9\xb9\x5e\xec\xb6\xb6\x9a\x9b\xa6\x0e\x37\x5b\x7b\x75\x7a\x34\xb9\xd9\xea\x74\x1a\x9b\x66\x19\x6e\xda\xbb\x77\x1a\x9b\x66\x05\x3e\xb0\xef\x3f\x32\xab\x63\x18\xe5\x60\xcb\x4e\x38\xa9\x35\x1f\x35\xe1\xc8\xad\xe4\xc5\xde\xf6\x66\xa3\x4d\x5e\x4d\x03\xb6\xee\xf3\xd7\x32\x64\x46\x9d\x77\xda\xad\xbd\xdb\x77\xcc\x0a\xac\x6f\x35\xb7\x5f\x23\x05\xb9\xf3\x0e\x7d\x46\x7e\x1f\x85\x9e\xeb\x27\xbb\x0f\x81\x16\xe7\xcf\x37\x20\x4e\xa6\x20\x44\xa9\x7c\xc3\xd2\xf5\x51\x89\x2c\x71\x47\x83\x23\x09\x48\xc6\x67\x1c\x87\x52\xb4\x48\x8f\xc9\x6b\xd6\xa9\x09\x13\x62\x8b\x6d\x30\x59\x96\xa5\x92\xe9\x33\xed\xff\x64\xcb\xf5\xd1\x7a\x5e\xa0\x99\x0d\x04\xeb\x84\xaa\x26\xca\x6a\x7b\xb9\x89\x5c\xc5\xad\xc0\xd7\x23\xba\x77\x65\x5e\xe4\xe4\x8a\x33\xfe\x57\x98\x0a\x64\xb6\x2c\x1a\x9a\xb1\xa6\xc9\x85\xe1\x6e\x70\xd2\x31\xcc\x9f\xce\xbc\x73\xba\x60\x74\x20\x1d\xc7\x39\x1a\xeb\x6c\x7c\x03\x2f\xc0\x58\xda\xb5\x23\x91\xa4\x03\xf2\x48\x27\x3a\x4a\x47\xd2\x4e\xc9\x22\x4f\x9d\x93\x73\x29\x8a\x74\xd3\xd8\x9a\x47\xa3\xfd\x7a\x3c\x55\x0b\xe6\xcf\xe7\x15\xde\x58\xc1\x2f\x99\xe0\x7a\x8f\xd4\xd8\x40\xfa\x7c\x4f\x46\x72\x2a\x33\x36\x00\x75\xc8\xc6\xb1\xc1\x46\x69\xaa\xf4\x8b\x4e\x6b\xc7\xd4\x61\xda\x97\x22\xb5\xb6\xa3\xee\x13\x61\x60\xf1\xda\x3e\x41\xe7\x11\x91\x65\xb2\xca\x97\xf9\x7b\x14\x54\xfb\x45\xae\x74\x4e\x92\x20\x9d\x57\x6a\x4d\x21\xf7\xb4\xe9\x4d\x49\xe6\x2f\xa4\xa4\x14\x51\x51\x29\x51\xc7\x51\x0a\x20\x4b\xb8\x39\xbd\x8c\x6d\xeb\xc6\x1d\x80\x6e\xe7\x4e\x77\x87\x2b\x8a\xa2\x72\x90\x42\x2d\x2c\x53\x97\xac\x5c\x91\x8c\x4a\xc2\xd2\xa6\x2e\x8b\x64\x83\x0d\x73\x47\x5d\x6c\x98\x84\x50\xf2\x79\x69\xb2\xfb\x76\x7c\xb0\xae\x9b\xfe\x78\x0c\x5e\x81\x7e\x12\x0e\x36\x82\x3e\xda\x09\x5c\x1f\x47\x29\xea\x89\x0d\x51\x44\x1d\xba\x59\x3a\x5d\xde\x89\x5d\xd1\x1b\x61\x4d\x18\x0d\xd9\x5a\xef\xc8\x09\x49\x26\x36\x56\x71\xb1\x48\xf7\x08\xfc\x9b\xd6\xd2\x52\x79\x6d\xb9\x50\xf0\x6f\x58\x4b\xcb\x15\x63\xad\x50\xc0\x37\x42\xe1\xcf\x6e\x3a\xcd\xd2\x72\xa5\xac\x5b\x96\xba\x5c\x5d\x32\xca\x85\x3a\x58\x47\xdc\x27\xb3\x6a\xe8\xe5\x4a\xc1\x07\x37\x6e\x18\x3a\x28\xb2\xaf\x3a\x28\x2e\x2f\x2d\x55\x96\x81\xa9\x72\x30\x1f\x40\x5c\x2a\x81\x31\xf2\x22\xb4\x10\x87\xa5\x2c\xa1\xe9\x9d\x16\xa2\xaa\xf2\x22\xcf\x3d\x54\x99\x41\x7d\x1a\x44\xe8\x91\xe5\xc5\x71\x5f\xd0\x2c\x0a\x3a\xe1\x80\x0a\x8e\x11\x93\xb8\x6d\x2b\x0e\x10\xf4\x72\x0f\xd5\x45\x9b\x67\xa8\x28\xb5\x0c\x69\x4b\x06\x0c\x2d\x45\xa9\x15\x8b\xf8\x86\x1d\xd3\x35\x9b\xc9\x0d\x0b\xaf\x33\xce\x60\xc6\x51\xfb\xb8\x5b\xf3\x6f\x58\x84\x18\x4b\xeb\x71\xb5\x4d\xd5\x2f\xd1\xb0\x65\xc8\xc3\x68\x5b\x14\x55\xff\xe6\x4d\x83\x08\xcb\x1f\x30\xf4\x72\xb5\x48\x49\x0e\x00\x54\x71\xd1\xb0\x2c\xcb\xbe\xbc\x8c\x2f\xf1\x37\x96\x2b\xab\x55\x50\x28\xa8\x61\xd1\x92\xeb\xcf\x1b\x2d\x5d\x7d\x44\xb8\x1b\x4b\x68\xe9\x31\xcd\xc3\x71\x5c\xcd\xd0\x52\xec\xfa\xc6\x66\xe3\xd6\xed\x3b\xcd\x0f\xbd\xb6\x75\x77\xbb\xb5\x73\xaf\xbd\xdb\xd9\xbb\xff\xe0\xe1\xa3\x0f\x3b\x07\xbd\x3e\x3a\x1c\x1c\xb9\x1f\x7d\xe2\x1d\xfb\xc1\xf0\x63\x61\x84\x47\x27\xa7\x67\xe7\x1f\xd7\x8d\x72\xa5\xba\xb4\xbc\xb2\xba\x56\xbc\xae\x40\xdf\xa2\x33\x3b\xe9\xd8\xfd\x64\x71\xba\xe7\xfa\x78\x95\x2e\x60\xd7\xf7\xbb\x54\xb3\x36\x09\x51\xcb\x4b\xcb\x84\x71\xea\xb5\xfa\x8d\x50\xb4\x44\xbd\x58\x04\xfe\x7e\x28\xf7\xbf\x3a\xe8\x5a\x75\x2a\xf0\xf5\x82\x7e\xde\x59\x8e\xb6\xb2\x74\x4d\x74\x7d\x98\xd8\xef\xc3\x90\x73\x6a\x52\x06\x74\xc4\x87\xb8\xeb\x07\x06\xe2\xc5\x15\x1c\x5d\xb1\xa8\x0e\xf0\x7e\xe2\x01\xa0\x5b\x28\xa8\xa8\x54\x82\x53\x31\xe5\x6e\xa1\x80\x4a\x25\xd6\xa3\x7a\x72\xdd\x17\x53\xeb\xf6\xfa\xe8\xf0\x10\x85\x85\x42\x1e\x40\x42\x8a\x42\x21\x5e\x51\x24\x81\xc9\xb9\x81\x16\x79\x6e\x0f\xd1\xf9\x5d\xca\x54\x45\xcc\x3e\x96\x11\x13\x01\xe8\x59\x2c\x9d\x1b\xb1\xa0\x1e\x58\xef\x65\x69\xde\x03\xb4\xd9\x43\x4b\xaf\x85\x37\x70\x2d\x2c\x5a\x55\xe0\x58\xfe\x7e\x6a\xc4\x87\xa0\x0b\xa3\xa9\xc0\xa2\x01\xba\x30\x98\x0e\x2e\x83\x2e\x74\xa7\x83\x2b\xa0\x0b\xbd\xfd\x7a\xb1\xd8\xb5\x9c\x1b\x37\xca\x97\xd1\xcd\x9b\x55\x11\xa0\x1a\x4b\x85\x08\xdc\xb8\x51\xbd\x0c\x6e\xde\x2c\xc7\xa1\x95\x42\x00\x6e\xdc\x58\xbe\x5c\xae\x14\x5c\x21\x24\xf5\xa8\x9d\x48\xe0\x9d\x93\x4a\x18\xcb\xb4\x16\x33\xf8\xa0\xd4\x07\xa8\x26\x33\xa9\x22\x22\x55\x2c\x03\xae\xd9\x6b\xef\x87\x45\xa3\x7b\xe3\xc6\xea\xa5\xbd\x1f\x76\x93\x1d\x04\xb9\x8c\x4a\xf9\x5d\x95\x51\x95\xcb\xa8\x74\x6f\xdc\x28\x57\x49\x21\xc5\x72\xf7\xc6\x0d\x63\xf9\x72\x66\xc9\xaf\xe0\x3a\x41\xba\xa6\xdf\x08\x46\x3e\x46\x61\x87\x1e\xe0\x68\x2e\xf3\xd1\xc3\xfd\xa9\xf1\x9d\x06\xb6\xc5\x13\xfb\x89\xcb\x2a\x50\x56\xc9\x24\x1a\xa8\x58\xad\x50\x37\x05\xe4\x6d\x8d\x7a\x29\xa0\x4e\x5b\xa9\x8b\x82\xaa\xe4\x9b\x20\x78\x29\xdf\x04\xae\xb5\xaf\xb4\xb6\x14\xa8\xec\x91\xc7\xdd\xc6\xf6\x9e\xd2\x85\x3d\x4b\xcd\xa0\x94\xb7\x9f\xc5\x2f\x41\xa3\xf7\xda\x00\x49\x94\xae\xf5\x03\x32\x57\x94\x8c\x45\xcb\x72\x73\x7c\x2e\x82\xd8\x06\x16\xc5\x57\xa9\x8d\x4f\x8f\x5c\x0f\x49\x77\xb5\x89\xec\x49\x8f\xc8\x27\x5a\x9e\x4d\x7d\x64\x09\x07\x20\xf1\xa1\x2d\xc1\x2f\x62\xb1\x81\x35\xcf\x71\xcd\x94\x03\x54\x9b\x3b\x40\x75\xa7\x92\x65\xf6\x89\x24\xd7\x2d\xa7\xa1\x33\x1c\xa2\x50\x89\x8d\x80\xd9\xee\x8e\xec\xef\x04\xa8\x01\x74\x01\x74\x33\xae\xb1\x2c\xc5\xe1\x16\xa5\x4a\x1c\xc7\x4c\x1b\x2c\x66\x7c\x10\x87\x66\xcf\x31\x44\x78\xca\x43\x27\x59\x3c\x51\xc5\x02\x18\x69\x53\x07\xd8\xfc\x38\xcd\xc9\x53\xca\x15\x67\xcb\x66\x92\xed\x21\xce\xa2\x40\xcd\x2c\xe6\x52\xd3\xf5\x7d\x2e\x9b\x95\x10\x3f\xa3\xa4\x39\x95\x44\x03\x31\xaf\x9e\xb9\xc6\xb4\x71\x02\x66\xfb\x56\x5c\x29\x2a\xc3\xb3\xa4\x70\xb2\x10\xb1\x3d\x77\xe0\x5b\xdc\xdc\x43\xd2\xb1\x9f\x51\x27\xae\x67\x9c\xaa\xd2\x5c\xb4\x2a\x2f\x80\x56\x0a\x29\x46\x91\x0c\x99\x24\x4c\xa9\xbd\x09\xf7\x06\xc2\xa7\x3b\xcf\xca\x14\xaa\x5f\x5d\x28\x1c\x59\x52\x7b\xd2\x0d\x2f\xd2\xc1\x47\x40\x32\xec\x1a\xa5\x0c\xbb\xee\x5d\xd5\x7b\xdd\xe3\x81\x02\x6a\xf7\xe8\xee\xef\x48\xd8\x7d\x25\x55\x08\x86\x09\xa5\x70\x30\x2c\x79\xe9\x7a\xb3\xad\xeb\x4c\xbd\xc5\xf6\xa7\x08\x95\x8f\xd8\xee\x31\xe1\x93\xe2\x76\x6a\x69\x4b\xd7\xae\xbc\x36\xb1\x36\x07\x97\xf8\x93\x9b\x5f\x1b\xda\xd2\xb5\xd3\x3c\x0c\x33\x81\x1c\xc3\x4c\x68\x76\x6f\x37\xc8\x90\x9a\x62\x9e\xe3\x60\x33\x76\x88\x59\x28\xa8\xbd\x19\xf4\x16\x67\xf0\xea\x2d\x55\x4a\x20\x8f\xce\xce\xf9\x10\xd1\x4b\x8d\x32\x14\xeb\x81\xab\x5a\x43\x5c\xc1\x92\x2d\xf9\x20\xe8\x9f\xd7\xf6\x52\x99\xb9\x00\xf6\xd6\x55\x24\xf9\xa1\x66\xb3\x65\xbc\x8a\xd4\x64\x85\x01\xb5\x07\x11\x00\x70\x2f\x75\x88\xe9\x02\x60\x4e\x67\x90\xb6\x7c\x72\xa9\x45\xbb\x4e\xd5\x5f\x2e\x5c\x1f\xa3\x01\x0a\x23\x73\xdf\x40\x15\xb8\xa6\xeb\x70\x49\xd7\x61\x95\x6f\x6d\xaf\x91\x4f\x58\x25\x1f\x70\x0d\x2e\xc1\x2a\x34\xba\x4c\x4f\x21\x32\xf7\x95\xbb\x0a\x54\x36\xc8\x63\x93\xbc\xd0\x87\x02\x95\x87\xe4\x41\x26\xac\x87\xf4\xa1\x40\xa5\x49\x1e\xf7\xc9\x0b\x7d\x28\xdd\x31\x91\xc3\xa4\xa2\xd7\x50\x05\xae\xa2\x0a\x5c\x41\x15\xb8\x8c\x2a\x70\x09\x55\x60\x15\x55\x60\x05\x55\x60\x19\x55\xa0\x40\x6d\x55\xd7\xe1\x8a\xae\xc3\x65\x09\xcd\x8a\xae\xc3\x72\x82\xee\x2a\x81\x80\xcb\x02\xef\x0a\x89\x64\xd8\xaf\xc2\x15\xb8\x4c\xeb\x50\x81\xe5\x54\x3d\xfe\xf7\x57\x14\xa8\xfc\xef\x2f\x93\xc7\x97\xc8\xe3\x8b\xe4\xf1\x05\xf2\xf8\x3c\x79\xfc\x39\x79\xbc\x41\x1e\x9f\x23\x8f\xcf\x92\xc7\x67\xc8\xe3\xcf\xc8\xe3\xd3\xe4\xf1\x9f\xc8\xe3\x53\xe4\xf1\xa7\xe4\xf1\x49\xf2\x78\x4e\x1e\xcf\xc8\xe3\x29\x79\x7c\x42\x81\xca\xff\xf3\xbf\xc8\xe3\xb7\xe4\xf1\x3f\xc9\xe3\x37\xe4\xf1\x0f\xe4\xf1\xf7\xe4\xf1\x6b\xf2\x78\x93\x3c\xfe\x8e\x3c\xfe\x07\x79\xfc\x2d\x79\xfc\x8a\x3c\x7e\x49\x1e\xbf\x20\x8f\x9f\x2b\xdd\x31\x1c\x59\xa9\xb6\xab\xc2\x17\x21\xe2\x0b\x13\x6c\x0d\x1a\xab\xd0\x58\x81\xc6\x32\x34\x96\xae\xa2\xdf\x3f\x7e\xe3\x1f\x09\x72\xff\xf8\x75\xf6\xf3\x35\xf6\xf3\x9f\xd9\xcf\x57\xd9\xcf\x57\xd8\xcf\x97\xd9\xcf\x97\xd8\xcf\x17\xd9\xcf\x17\xd8\xcf\x0f\xc9\xe3\x6f\xc8\xe3\x07\xe4\xf1\xd7\xe4\xf1\x7d\xf2\xf8\x1e\x79\x7c\x97\x3c\xbe\x43\x1e\x7f\x45\x1e\x7f\x49\x1e\x7f\x41\x1e\xdf\x24\x8f\x6f\xfc\xe3\xd7\xd9\xcf\xd7\xd8\xcf\x7f\x66\xf8\xf0\x9f\xaf\xd2\x40\xfa\x4e\x11\xa4\xe8\x51\xe4\x28\x6a\x14\x31\x8a\x16\x45\x8a\xa2\x44\x48\x7c\xef\xdd\x90\xf8\x15\xf6\xd3\xff\xf3\x9c\xf4\x86\xff\xf3\xfc\x67\xf4\xf9\x53\xfa\xfc\x15\x7d\xfe\x77\xfa\xfc\x09\x7d\xfe\x98\x3e\x7f\x44\x9f\x3f\xa4\xcf\xbf\xa1\xcf\x1f\xd0\xe7\x5f\xd3\xe7\xf7\xe9\xf3\xbf\xd1\xe7\xf7\xe8\xf3\x97\xf4\xf9\x5d\xfa\xfc\x0e\x7d\xfe\x15\x7d\x7e\x9b\x3e\xff\x92\x3e\xbf\x45\x9f\xbf\xa0\xcf\xbf\xa0\xcf\x6f\xd2\xe7\x7f\xa1\xcf\x6f\xd0\xe7\xd7\xe9\xf3\x6b\xf4\xf9\x73\xfa\xfc\xcf\xf4\xf9\x55\xfa\xfc\x0a\x7d\x7e\x99\x3e\xbf\x44\x9f\x5f\xa4\x4f\x4a\xee\xd3\x1c\xa7\x1b\xb0\x9e\xc8\xcb\x37\xd0\xe5\xa5\x7d\x13\xaf\xdf\x22\xd2\x1f\xac\xc7\x3a\x3a\xc0\x0c\x35\xd1\x4e\x5a\x88\xfa\xa3\x9e\x74\x04\x4f\xf2\xf1\xd9\xe2\xa4\x66\xdf\xb4\x70\x0d\xd8\x25\x0b\x43\x54\xb4\xf8\x8d\xc3\xd1\xbe\x1f\xbb\xd2\x45\x63\xa8\x28\xa0\x58\x1f\xc3\xbd\x99\xfe\x65\x14\x85\xc8\xd0\xf8\xf2\xd2\x2e\x95\xa0\x6f\x85\xaa\x0d\x8a\x3e\xb4\xaf\x5b\x88\xcb\xc9\xf6\x35\x74\xd3\x4a\x84\x65\x7f\x0c\x07\xb9\xde\x44\xf8\x49\x69\x09\x15\x0d\x0e\xab\xda\x37\xf4\x75\xa5\xa4\x98\x04\x09\x75\x8f\x79\x0b\x70\x0e\x22\xd5\x06\xb0\x0e\x43\x38\xbd\xf9\x48\x9d\xdd\xa4\x77\x7c\x58\xaa\x43\x2f\x08\x42\xd5\xfe\x40\x1d\x14\x11\x18\x83\xa2\x0f\xc6\x29\xab\xf8\x44\xf5\x21\xbb\x45\x73\xb3\x2c\x2d\xb4\x93\x4d\x9a\x72\x77\x5d\xfe\x30\x15\x6d\x41\x81\xa1\x15\xeb\x18\xf2\xda\xa6\x91\x0e\xe1\xa2\x91\x83\xf5\x02\xda\x4f\x21\x19\x82\xee\x18\x14\x71\xd6\x78\x9e\xb4\x1c\xac\x43\x66\x84\x69\xdf\x28\xad\xad\xad\xad\x91\x1e\x40\x7e\xc5\x3a\x85\xf4\x05\x27\x6b\x92\x26\xdb\xaa\xc8\xfd\xa4\xc6\x16\x1a\x32\x86\xae\x55\xaf\x65\x4d\x3c\xd1\xbe\xde\x2d\xba\xf1\xce\x4f\xcf\xd2\x6b\xc1\x4d\xbd\x50\xe8\xdd\xb0\xaa\xb5\x9e\xd0\xa5\xf4\xac\xe0\x03\x86\x5e\x23\x29\xbd\x42\x81\x2f\x25\x84\xa3\xcf\x88\xda\xde\x2a\x0a\x59\x65\xad\xbb\x16\xda\xf7\xba\x45\xd7\xf4\x6e\x1a\x97\x97\x06\x4b\x40\xd2\xf5\xe2\x2f\xf2\xd3\xcb\xc9\xa5\x0c\xae\x04\xa9\x82\x42\xc1\xbe\x69\xe8\x7a\x0c\xd9\xa3\xb7\xba\x65\xe1\x56\x81\x40\x44\xed\xdd\xd4\xd7\xf1\x7e\xaf\x64\x74\x69\x4f\x73\xcd\x38\xa1\x5e\x28\xa8\xae\xc5\xe2\x8a\x2e\x80\x9c\x58\xac\xa1\x82\xeb\x46\xbc\x35\x46\xbb\xaa\xcf\x92\x8f\xe1\x2d\x2b\x6f\x45\x3d\xe3\xa6\xc1\x75\xd2\x75\x4c\x45\x81\x3e\x79\x9f\x7c\xe2\x29\xfd\xa8\x93\x0f\x48\x23\x6a\x19\xcd\xc2\xe9\xf6\xa5\x96\x86\x7c\x27\xf2\xff\x7e\xe2\xbb\x4a\x6d\x06\x1c\x37\x45\x14\x90\x5f\xfb\xfe\x4c\x48\x6e\xab\x18\x43\xfe\x76\x26\x64\xae\xd1\x22\x5b\xdf\x0e\x54\x1b\x56\x57\xe1\xd2\x0a\x5c\xd4\x61\x28\x69\x27\xf0\xcd\xcf\xea\xba\xa2\x2b\xc5\xc8\x8c\x66\xe2\x2b\x99\x47\xf2\xc4\x1b\xaa\x0d\x95\xc9\x27\xfe\xd3\x5b\x6f\x7e\xe2\xad\xbf\xff\xdc\x5b\x6f\xfe\xd9\xdb\xdf\xfc\xe6\x5b\x7f\xff\x95\xb7\xff\xf4\x27\x6f\xbd\xf9\xfc\xed\x3f\xfd\xd1\x5b\xbf\xfe\x96\x02\xb9\x2b\xd3\x9c\x1c\x65\x5b\x4a\x9e\xe3\xa9\x6a\x43\x03\x56\xd6\xd6\xd6\x60\x0f\xce\xac\x1f\x0c\x41\x9e\xba\xe6\x34\xbc\x6c\x9f\xf9\xb2\x25\xcc\xc7\x9a\x59\x79\xf2\x3c\x09\x6d\xd7\xaa\x4b\x70\x6d\x79\x8d\x30\x95\xab\xd2\x32\x2b\x50\x39\xed\x0a\x34\xca\xe5\xf9\x49\x65\x03\x52\x29\xe9\xf2\x12\x99\xb0\xe7\xa6\x4c\xd9\x9a\x4a\x49\x8d\xe5\x4a\x19\x1a\xcb\x55\x83\xf7\x88\x99\xc9\xb9\x29\xe1\x7c\xc4\x04\x54\x8a\xcc\x84\x1b\x42\xef\x0f\x20\xf3\xbb\xce\xf6\xc5\xfa\x87\x30\xb5\x95\xa8\x52\x5e\xaa\x54\x61\x79\xa9\x5a\x99\x4f\x95\xc4\x32\x77\x06\x00\x33\x58\x95\x5b\xca\x30\xca\x70\xd9\x28\x5f\x41\xee\x1c\x2b\x5f\x79\xb4\xbd\xfd\x93\x2f\xbc\xf5\xe6\x17\xdf\xfe\xe9\x9f\xbe\xfd\xc6\x4f\x7f\xff\xdb\x9f\xbd\xfd\x77\xbf\x7c\xfb\x8d\x4f\xff\xee\x2f\x7e\xf8\x4f\x5f\xf9\xe5\x3f\xff\xe9\x9f\xfd\xee\xd3\x9f\x7b\xeb\xef\xff\xdb\xbc\x31\x37\x6d\x2e\x2c\xe7\xfe\x4f\x5f\xf9\xc5\x5b\xbf\xfe\xc6\x5b\x6f\x7e\xe3\xad\x37\x9f\xfe\xee\xd3\x9f\x79\xfb\xef\x7e\xfe\xf6\xdf\xff\x97\xdf\xff\xf6\x9b\x6f\xff\xd7\x1f\xff\xd3\x37\xde\xbc\x2a\x5f\xd9\xe2\x78\x06\x58\xbe\xd9\x2a\x47\xa1\x4f\x50\xf8\xe7\x6f\xfe\x8f\xb9\xec\x44\x79\xfb\x8d\xa7\xff\xf4\x8d\xdf\xbe\xfd\xc6\xf3\xdf\x7f\x81\x48\x93\xbf\xff\xc5\x5f\x29\xd0\x87\x46\x75\x26\x6a\x79\x16\xb4\x99\x12\xdf\xfe\xaf\xbf\xfe\xfd\x2f\x7e\xf9\xf6\xe7\x9f\xff\xfe\xd9\xa7\xde\xfa\xcd\x1b\xff\xfc\x8d\x37\x7f\xf7\xed\x2f\xfd\xee\x8d\xcf\xfd\xd3\x9f\x13\x01\xf1\x77\x9f\xfd\xed\x5b\xff\xf3\x67\x6f\xfd\xc3\xb7\xd3\x25\x2e\xcd\x2c\x31\xdf\xe4\xf7\x0f\xaa\xe5\xaf\xbe\x7d\x45\x2d\xf3\xac\x8f\x73\x6a\xf9\xab\x9f\xbd\xfd\xf9\xa7\xa2\x96\x9f\x9a\x57\x4b\x5e\xe2\xec\x5a\x4e\x1b\x74\xcb\xe5\x5d\x35\x2d\x24\x35\x7c\xeb\x4d\xb2\x42\x9d\x3c\xff\xcb\xc9\xb3\xef\x4d\x9e\x7f\x66\xf2\xec\xd7\xa4\x60\xfd\xea\x72\x67\xd5\xf2\xe7\x6f\xff\xe6\x0b\x6f\x7f\xfe\x19\x29\xf5\x37\x6f\x64\x4a\xfd\xdd\x67\x7f\x3b\xaf\xd4\x95\x99\xa5\xe6\xda\x9d\xcb\x45\xbf\xf3\xf5\xa7\xef\x7c\xeb\x37\xef\x7c\xeb\x57\xef\x3c\xfb\xcd\x3b\xcf\x7e\xfc\xce\xd7\xbf\xf7\xce\x5f\x7c\xe7\x9d\x5f\xff\xd5\xff\xf7\xb9\xaf\xfc\xbf\x7f\x4b\x28\xfa\xce\x67\x7f\xf2\x2f\x3f\xfb\xf9\x3b\xbf\xf8\x8b\x7f\xf9\x6b\xb2\x56\xff\x97\xbf\xfe\xf4\x3b\xdf\xfa\xd5\xbf\x7c\xf2\xd3\xef\x7c\xe6\x7b\x0b\x0a\xac\xbf\x50\xd9\xb2\x11\xfb\x1f\xd2\x9f\xa6\x0a\xd7\x5f\xac\xf0\x2b\x86\x4f\x6e\xd1\x31\xc9\x5f\xae\xd2\x92\xc3\x02\x99\x3d\x57\xf5\x65\x58\xae\x1a\x4b\xf3\xb9\x68\xec\xcb\x20\x35\x6f\x18\x74\xe2\xb8\xf7\xae\xe6\xa3\xd8\x23\x82\x8c\xcc\xca\x9a\x4e\x1e\x6b\x57\x20\x23\x1c\x28\xc8\x49\x97\x97\xcb\xb0\xbc\xbc\x72\xc5\x6c\xc0\xfd\x2d\xa4\x6b\xa1\x93\x5a\x8c\xde\x55\x2d\x62\xaf\x0d\x29\x09\xee\xe9\xb3\xc9\xd3\x4f\x4e\x9e\x7e\x6a\xf2\xf4\xd3\x93\xa7\x9f\x99\x3c\xfd\xec\xe4\xe9\x1b\x93\xa7\x9f\x9f\x3c\xfd\xe2\xe4\xe9\x97\x27\x4f\xbf\x3a\x79\xfa\xb5\xc9\xd3\x6f\x4c\x9e\x7e\x73\xf2\xf4\x5b\x93\xa7\xdf\x9e\x3c\xfd\xce\xe4\xe9\xf7\x26\x4f\xbf\x3f\x79\xfa\x83\xc9\xd3\x1f\x4e\x9e\xfe\x68\xf2\xf4\xc7\x93\xa7\x3f\x99\x3c\xfd\xef\x93\xa7\x3f\x9d\x3c\xfd\xc5\xe4\xe9\xdf\x4e\x9e\xbe\x39\x79\xfa\x0f\x93\xa7\xbf\x9d\x3c\xfd\x5f\x93\x67\x9f\x98\x3c\x7b\x3a\x79\xf6\x6c\xf2\xec\x93\x93\x67\x9f\x9a\x3c\xfb\xf4\xe4\xd9\x9f\x4d\x9e\x7d\x66\xf2\xec\xb3\x93\x67\x9f\x9b\x3c\x7b\x63\xf2\xec\xf3\x93\x67\x5f\x98\x3c\xfb\xe2\xe4\xd9\x97\x26\xcf\xbe\xac\x5c\x89\x3e\xf7\x0b\x91\xae\xc4\x27\x49\x4e\xa4\xfc\x1f\xd1\x92\xdf\xa4\xd8\x7d\x87\x94\xf3\xf4\xc7\xb4\xa8\x2f\x91\x72\x9e\x7e\x96\x94\xff\xf4\xdb\xa4\x64\x52\x9b\xef\x51\xc4\x7f\x48\x31\xfa\x04\xa1\xc1\xb3\x2f\xd0\x7a\x7c\x86\x10\xe0\xd9\x27\x69\x0d\xbe\x48\x2b\xf4\x65\x4a\x9e\xef\x53\x6a\x7d\x95\x50\x88\x54\xe5\x29\xa9\xdf\xd3\xaf\x11\xdc\x9f\xfe\x82\x54\x91\x10\xe9\x1b\xb3\x6b\x20\x1c\x5e\x48\x5d\xa1\x52\xd1\xcb\xb0\x52\x31\xae\xe8\x0a\xb1\x7f\x8c\x54\xad\x9f\x7d\x97\xf0\xaf\x67\xdf\x9f\x3c\xfb\xc1\xe4\xd9\x0f\x27\xcf\x7e\x34\x79\xf6\x93\xc9\xb3\x9f\x4e\x9e\xfd\x7c\xf2\xec\x97\x93\x67\x7f\x3b\x79\xf6\x77\x93\x67\xbf\x9e\x3c\xfb\x87\xc9\xb3\xff\x39\x79\xf6\xbf\x26\xcf\x9f\x4e\x9e\x7f\x72\xf2\xfc\x53\x93\xe7\x9f\x26\x5c\xef\xf9\x67\x27\xcf\x3f\x37\x79\xfe\xc6\xe4\xf9\x9f\x4f\x9e\x7f\x7e\xf2\xfc\x4b\x93\xe7\x5f\x9d\x3c\xff\xfa\xe4\xf9\x37\x09\x67\x7c\xfe\xed\xc9\xf3\xbf\x9a\x3c\xff\xce\xe4\xf9\x77\x27\xcf\xbf\x37\x79\xfe\xfd\xc9\xf3\x1f\x4c\x9e\xff\xcd\xe4\xf9\x0f\x27\xcf\x7f\x34\x79\xfe\xe3\xc9\xf3\x9f\x4c\x9e\xff\x74\xf2\xfc\x67\x93\xe7\x3f\x9f\x3c\xff\xc5\xe4\xf9\x2f\xe7\x89\x08\x19\xa7\x1e\xe9\x6a\x7c\x8f\xe6\xf5\x79\x8a\xd0\x37\x29\x06\x9f\xa6\xb8\xfe\x90\xe2\xf7\x23\x9a\xfb\x4f\x49\xf5\x9e\xff\x80\x56\xe3\xc7\xa4\x3e\xa4\x26\x6f\xd0\x6a\xfc\x0d\x41\xf4\xd9\xf7\x29\x2a\x7f\x4e\x09\xf1\x53\x8a\xf1\x5f\x12\x42\x3c\xff\x2a\xa5\xc5\x0f\x48\xb5\x09\xbd\xfe\x96\xd0\x88\x54\xe6\x3b\xa4\x86\xcf\xfe\x8e\x62\xff\x25\x52\x49\x42\xa6\x5f\xcf\x5d\xb2\xd8\xad\x54\xd3\xad\xac\x95\x61\x65\x55\xbf\xa2\xe9\x12\x2f\x22\x29\x79\x70\x59\x27\x8f\x2b\x98\x87\x70\x3a\x22\xa5\xac\x92\x94\xd5\x2b\x53\x32\x1f\x25\x32\xcf\x59\x33\x56\x61\x79\xad\xbc\x32\x3f\x9d\x70\x69\x22\x2f\x15\x56\x56\x96\xa1\xb1\xb2\x7a\x05\xd7\x65\x1e\x4d\x64\xfa\xe8\xd5\x65\x58\xd1\x97\xae\x4a\xc7\x1c\xa0\xc8\x09\x8d\x95\x2a\xac\x18\xab\x57\x48\xe1\xd4\x5f\x8a\x9c\x6c\x79\xb9\x0a\x2b\xcb\x2b\x57\x25\xe3\xee\x55\xe4\x94\xab\x2b\xa4\x25\x57\xaf\x68\x49\xb1\x00\xce\x18\xec\x65\x16\xd7\xaf\xe8\x52\xdb\x3f\x56\xeb\xda\x65\x66\x5c\x6b\x18\x53\xc6\xb5\xd2\x56\xa1\xb8\x43\x9b\xab\x4e\x51\x2d\x59\x9b\xdd\x78\xb9\x8b\x83\x61\x34\x5b\xa9\x32\xc2\xc1\x70\x4c\x75\x1b\x8d\xeb\xf1\x4d\xdc\x06\xc4\xa0\x96\x4a\x9f\xe7\x18\x8e\x5e\x58\xb7\x21\x60\xd4\xf0\x1a\xcb\x4d\x14\xac\x61\x71\x93\x0c\x00\x63\x30\x86\xd1\x2c\xb3\xe0\xf7\xd5\x24\x98\x29\x1c\x58\xe8\xf2\xb2\x3f\xe3\x64\x57\x58\x18\xc9\xa6\xc1\xdc\x2a\x38\x44\x7e\x1f\x85\x53\xf6\xc0\x36\xb8\x60\x79\xe3\x33\x4b\x2a\x64\xca\x02\x89\x61\x10\x0c\x49\xa2\xc8\xb2\x65\x84\xf8\x79\xab\xbc\xf9\xca\x7d\xf2\xdb\x5a\xd4\x73\x3c\x94\x42\x5f\x1c\xc4\xa6\xc0\xb9\x8b\xfd\x5c\x78\xf9\x4c\x97\x67\xcc\xce\x70\xa7\x81\x78\xd6\xf1\xf5\xf6\x12\x18\x3e\x63\x79\xab\x72\x3d\x58\x10\x9c\x0e\x02\x49\x2a\x7a\xb9\x97\xe7\x60\xa4\x96\x6c\xed\x0c\x96\x6c\xed\x5c\x8e\x45\x67\xb8\xee\x44\xc8\x73\x7d\x64\x09\xc7\x94\xd0\xd6\xbc\x60\x30\x40\x21\xf9\xa1\x0d\x7d\xe2\x44\x0b\xac\x01\x50\xb8\xe0\xfa\x2e\xe6\xe6\x40\x0b\xaa\x52\x8c\xeb\x74\xa6\x14\x13\xcc\x17\x1c\xbc\x40\xbe\xcf\x8a\x0a\x24\xbf\xe7\x45\x05\x2c\x9c\xba\xf8\x68\x81\x22\xb8\xa0\x14\x73\xb0\x8e\xef\xa3\xea\x79\xee\x70\xba\xa9\x93\x31\x47\x6f\x4d\x16\x0a\x55\xe2\xa2\x61\x4a\x23\xe7\x04\xa9\x00\xda\xb9\x83\x06\x6b\x43\x07\x1f\xa9\xa4\x3b\x52\x60\x52\x8a\x0a\xc8\x08\x64\x69\x44\x76\x71\x6e\x21\x8a\x70\x10\x22\xe9\xce\xbd\xd8\x3c\x29\x0f\x3b\xc2\x6d\xe3\xb4\xb2\x21\x13\xd3\xdf\x80\xf4\x34\x1c\x8a\xbb\x0f\x44\x73\x43\xcc\x62\x31\x8d\x4d\x6e\xb2\x10\xb7\x54\xc8\x45\xef\x1e\x39\x43\x94\x4f\x18\x6e\x68\xcf\xeb\x27\xb0\x48\xec\xc9\x90\xc4\x13\xd2\xf1\x52\xf5\xc8\xe7\xbc\x21\x26\xe5\x67\xbf\x48\x7e\x03\x84\x3b\x4e\x38\x40\xf8\x8a\xab\xe3\x66\x0c\x5a\x2d\x42\x89\x41\x7f\xea\x32\x53\x98\x35\xe4\x92\xb2\x49\x8a\x27\xe4\xc8\xab\x0e\xd3\x07\xa3\x9d\x28\xc6\xfc\x00\x0d\x5c\x7f\x87\xd0\x0f\xc0\xb4\x32\xa4\x0d\xd6\xf3\xfa\x53\xb2\x79\x6f\x33\x1f\x88\x96\xe5\xcb\x5e\x10\xd7\x6d\xd3\x66\x17\x5e\xd3\xe3\x10\xbc\x8e\x68\x39\xc7\xc1\x09\xea\x04\x6a\xa8\x9d\xc1\x50\x3b\xa7\x7a\x09\xf8\x8c\x5e\x1e\x2c\x85\xc2\x6c\x96\xb2\x73\xc9\x42\x01\x71\x8c\x3f\xee\xa2\x90\xde\xc7\xd9\x09\x54\x5e\x16\xa1\x5f\x18\x78\xda\x19\xcc\x04\x9c\x43\x5b\x43\x7e\x5f\x8e\x97\x3e\x79\xac\x08\xd6\xce\xc1\x18\x98\x31\x6d\x9c\xb0\xa7\x92\xa1\x6c\x6b\x21\xbd\xc6\x13\x92\xf1\x2c\x7d\xf0\x17\x1d\x96\xaf\x51\xb6\xb8\xd3\x84\x64\x9a\x8e\xd3\x53\xf7\x2c\x8c\xb6\x71\xdb\x84\xa8\x87\x1d\x7f\xe0\xcd\x18\x49\xec\x34\x30\xa7\xdf\xf9\x33\xfb\x1d\xb5\x92\x14\xe7\x92\x52\x39\x84\x6d\x6d\xb9\x3e\x72\x42\x71\xb5\xc9\x55\xac\x85\x21\x4d\xa7\xa6\x74\x42\xd5\x16\x9e\xda\xfb\x2e\xa9\x80\x1b\xf8\xda\x99\x41\x5a\x8b\x3a\x6a\x4f\x02\xcf\x0d\x98\x07\xaa\xe7\x81\xea\xa0\xe6\x50\xbf\x16\x79\xc3\x16\xe7\xd5\x91\x31\x0c\x9a\x15\xe4\xec\x17\xda\x53\x0c\x83\xd5\xbc\xed\xf4\x5d\xc7\x7b\xd1\x9a\x73\x53\x00\x8a\x77\x0f\xf9\x18\x91\x1e\xe9\x5b\x02\x6b\x1e\x74\x0e\xeb\x59\x3a\xa5\x8b\x51\x43\xe8\x43\x9d\x1e\x55\x23\xde\x3b\xb4\x33\x7e\x1f\x9c\x7b\xa8\x92\xea\xd6\x73\xab\x5b\x97\xe0\x17\x2d\x2b\xfe\x38\x17\xda\x92\x1c\x3b\x6d\xe9\x9a\xa8\x78\xc0\xb1\xa3\x41\x9c\xa5\xba\x52\xca\xeb\x49\x8e\xb0\x67\x19\xd7\x5d\x36\xe6\xe3\x4b\x2f\xd5\x08\x06\x70\x9f\x31\x17\x97\x3c\xbb\x30\x87\x4b\xe5\xb6\x40\xef\x9a\x4a\xcb\x2e\x05\xa0\x18\x4c\xb5\xc4\xb5\x1e\x91\xbd\xa8\xdd\xc2\x1f\xda\x86\xcc\x2f\xf6\x55\x03\x65\x0e\xf7\xcf\xb4\xd6\x8e\x83\x31\x0a\x7d\xc6\x35\x43\x14\xb9\x1f\x47\xc2\x5e\x19\x03\x28\xfc\x70\xe7\x4a\x11\xa4\xb8\x2c\xbf\xcf\x95\x36\x42\x58\xf2\xb3\x15\x99\xe9\xd6\x25\xa3\x01\xe0\x64\x98\xf3\x61\xe0\x63\x6b\x9f\x6b\xd8\x91\x0a\x41\xf6\x7e\xdf\x09\x5d\xc7\xc7\xfc\xeb\x81\x98\x4f\x85\x22\x1e\x7f\xbd\xe5\x1c\xbb\xde\x79\x57\xfb\x68\xe0\xfa\xd4\x9a\x6e\x86\x7c\x40\x7a\xe6\xbc\x59\xd3\x2f\x14\x98\x51\x99\xf0\xc6\xce\x1d\x2f\xf9\x4c\xcb\x5e\xd5\x81\x16\xa2\x13\x14\x46\x48\xcd\x71\xe7\x8c\xc0\x05\xcb\x3d\xa2\x77\x98\x53\xe1\xdd\x42\x53\xf2\x3a\x94\x81\x5a\x87\x87\x11\xc2\x0f\x2d\xa4\x05\xec\xed\x9a\x93\x91\xfd\xa6\xa1\x1f\xc5\xd0\x8f\xe6\x42\xd7\xbd\x11\x29\xff\xc0\x1b\x85\x30\xa9\x36\x69\x21\x6e\x3a\x47\xdd\x8d\xc4\xfa\xa6\xc9\x17\x19\x6c\x76\x5a\x8b\x91\xcc\x16\x7f\x70\x1e\x90\xdf\x4c\x1b\x8a\xb1\x1e\xe6\xd9\x21\x5e\x5e\xa2\x5a\x98\x63\x45\x99\x4b\xf0\xcc\x99\x79\x3d\xd7\x48\x35\xb1\x21\xe5\xd7\x6a\x26\x54\x23\xbd\xe7\x2e\x22\x6b\x67\x2a\x9c\xf0\x57\x15\x03\xed\x80\x0b\xcd\x35\x47\x8b\x67\x32\x35\x5d\x59\xc9\xcb\x4a\xaa\xde\x21\x48\xe8\xc0\xc6\xbd\x01\x23\x20\xab\x04\xcf\xc0\x33\xb6\x9f\x7d\xe9\x32\xdf\x6d\x89\x29\x33\x5d\x6e\xbc\xf4\x02\xc4\x39\x76\xfb\x7d\xef\x4a\xd2\xf4\x90\xeb\xa5\x29\xe3\xe7\xe2\x49\xad\xe3\x64\x4e\x12\xb3\xab\xfc\xd9\x8c\x3a\xb2\x61\xeb\x2d\x4b\x5c\x2d\x47\x46\x2e\x5f\x5d\x59\xf1\x95\x6c\x42\xb5\xc5\xae\xc9\x53\x3f\x13\x45\xe7\x2a\x20\xc7\x8e\x30\xe2\xd9\x81\x15\x87\x32\xc2\xbb\x25\xc9\xf8\x53\xb2\x6d\xc6\xd3\xc1\xd4\x24\x40\x03\xb3\x8b\x05\xe6\xc9\x9c\x11\x22\x42\xb8\xc5\x6e\xe8\x9e\x2b\xb2\x0f\xbc\xe0\xc0\xf1\x6c\x6f\x78\xe4\x58\xc9\x7d\xe5\xf1\xf4\x37\x8b\x15\x4b\x39\xf0\x45\x55\x0e\x93\xa7\xb7\xa3\xa4\xc3\xe9\x94\x1a\x5f\xb2\x00\xf1\x7e\x99\x3c\x2a\xe4\x51\x25\x8f\xa5\xee\x8c\xc5\x29\x2c\x21\x00\x43\xb9\x1c\x69\xf9\x35\xed\x9b\x2b\xfa\xf7\x9d\xae\xf7\x66\xa7\xab\xc6\xc6\xf5\xbf\x15\xbf\x71\xc8\x27\x95\xef\xe7\xda\xc5\x31\x87\x35\x85\x02\xdf\xf2\xa0\xeb\x1b\x2b\xbc\xbc\xdc\x74\x30\xd2\xfc\xe0\x54\x74\x1e\xb7\x6f\xe1\x9c\x2d\x24\xaa\x00\x3e\xed\x51\x2e\x75\xbb\x9a\xad\xca\x58\x40\xb9\xa4\x84\x05\x79\x41\xde\x85\xef\xee\x61\x2a\x6d\xa1\xc0\xfd\xeb\xf4\x02\x3f\x0a\x3c\x94\xfd\xd6\xbc\x60\x90\x74\xaa\x69\xd3\x52\x88\x2c\xb1\xfe\x84\xac\xcb\xd9\xb4\xaf\x91\x4e\x66\xa5\xec\x44\x6f\x71\x1c\x24\xb3\xbf\x03\xd7\xef\x6b\x84\xea\xea\x74\xa1\x30\x1d\x04\xf8\xc6\x65\x3a\x14\xee\x27\x44\x2d\x25\x34\x28\x2a\xc7\x91\x22\x88\xbc\x2e\xdb\x11\x2d\xa8\x7c\x4b\xc7\xed\x17\x15\x60\x2a\xa6\x1c\x69\x2a\x5d\x92\x71\xcf\xc1\xea\x7e\x97\x49\x4b\x0c\x3b\x04\x75\x00\xe8\xb6\x35\xa3\x2c\xf5\xd3\xf4\x1e\xd0\x96\xe6\xf3\xfe\x53\x97\x16\xfb\x6f\x92\xbe\xd3\x0c\xd4\x7f\x45\x8e\x10\xf8\xe5\x92\x16\x4a\xdf\xbb\x38\xed\xfb\xc0\x78\x31\xdf\x07\xd9\x7c\xae\x70\x6a\xc0\x77\xea\xf7\xe9\x25\x39\x90\xdb\x5b\xc1\x78\x6b\x93\x99\x35\x75\x6b\x19\x64\x73\xf6\xe7\x9d\x29\x0f\x06\xb9\x97\x8c\xe6\x39\x08\x10\x97\x69\x29\x45\x44\xf7\xdf\x5f\xcd\x54\x85\xa8\x40\x78\x6b\xab\xf5\xe0\xf1\x83\xb6\xbd\x63\x5d\x6c\x33\x1d\x09\x1d\xd6\xdb\x0d\xfb\xb5\xc7\x0f\x5a\xed\x4d\xd3\x88\xdd\x97\xb4\x4e\x50\x78\xe8\x05\xa7\x0f\x42\x67\x38\xf7\x76\x22\x22\x15\x96\x4e\x83\x30\x71\xbe\x11\x6a\x49\x8e\xc2\x91\x2e\xf3\x01\x9c\x39\x8e\x0a\x35\x86\xc3\xf8\x95\x55\x39\xb9\x89\x63\xb7\x63\x77\x9a\x1b\xa4\x27\x34\xb6\xec\x4e\x93\x5e\xba\x62\xd7\x77\x5b\x5b\x7b\x9d\x86\x59\x86\xb7\x9a\x0f\xa9\x0b\x9b\xdd\x4e\x73\xe3\xb5\x47\x66\x35\xa6\x43\xce\x1d\x9b\x53\x34\x08\x91\xe7\x60\xf7\x04\x49\x14\x10\xa5\x70\x0f\xf6\xc2\xf2\x31\x01\x10\x65\x33\x80\x43\xf7\x0c\xc9\x04\xa4\xe8\x70\x87\xd1\xd8\xed\x3d\x39\x97\xe2\x18\x8a\x63\xe9\x9b\xd4\xec\x95\x91\x30\xed\x23\x34\x76\x23\x92\x78\x26\x35\x60\xe2\x37\xb4\x0c\x25\xd7\xa3\x95\x94\x2f\x9c\x78\x67\x76\xae\xcf\x9e\xe1\x10\x85\xf4\x2d\xa9\x6f\x9c\xbb\xe4\x43\x3c\x03\x12\x23\x23\x1c\xfe\x0f\x5d\x4c\x8f\x1c\x24\x98\x04\xb1\xb1\xd4\xfd\xa8\x27\xe7\xf7\x9a\xb1\x85\x88\x3a\xbd\xc6\x4d\x7f\x38\xe2\x8e\x63\x63\xd3\xe8\x5d\xea\x7c\x33\x31\x8c\x66\xa1\x84\x40\x76\x88\x9c\x6c\x38\xcd\x21\x65\x45\xcd\xf3\x0c\xf9\x5e\xdd\x88\xe4\xdc\xdc\xde\xd9\xeb\x3c\x4e\xee\x31\x4f\x82\xa8\x7b\x97\xdd\xf8\x7b\xa3\xb5\xd5\x6a\xa7\xcd\xaf\x3d\x6e\x6d\xed\xb3\x9b\x6c\xe8\x01\x66\x19\x40\x87\x46\x2c\xe9\xf4\x8e\x78\x8f\xdf\x16\x1f\xd0\x37\x6a\xc0\x47\xdf\x0c\x00\x60\xcf\x52\xe9\x15\xf2\xd4\xa9\x30\xc4\x6a\x15\x48\xa6\xda\xde\x0b\x9b\x6a\xa7\x31\x24\x3c\x33\x88\x79\xe6\x7e\xb5\x0c\xe9\xbf\x2e\xeb\x95\xa3\x6c\xbc\xb1\xbc\x04\xf9\x5f\x17\xc0\x7b\xd9\xe8\x72\xb9\x0c\xf9\x5f\x17\xc0\x53\xeb\x42\x76\xac\x62\x40\xd9\x05\xcb\x28\xe5\x82\xa5\x9e\xf2\xa0\xc3\x5d\xc3\xb0\x8b\xd0\xd3\xf4\xdd\x3f\x85\xf4\xff\x2e\xcc\x69\x8c\xa9\x7b\x25\xef\x4d\x5d\x1c\xb9\xdf\xcd\x5e\x1a\xe9\x67\x6f\xb5\x97\x2f\x57\x9c\xbe\x3e\xd2\x9f\xbe\xc5\x5e\x4e\xc0\xae\xb5\x76\x93\x1b\xdd\x96\xf4\x0f\xb0\xdb\xad\xf7\xf7\xe0\x5e\x17\x6e\x58\xfb\x03\x48\xff\xef\xc2\xbe\x95\x81\xad\x0c\xcf\x14\x00\x6f\x59\xfb\x7d\xd8\xef\xc2\x86\xb5\x7f\x0b\xd2\xff\xbb\xf0\x90\x9b\xd1\x4f\xf7\xc9\x9c\x9b\xef\x42\xa7\xef\xb2\xab\xef\xe8\x61\xc5\xfa\x86\xd9\x48\x6c\xdf\x53\xfd\x7c\x6a\xf5\x90\x4d\x7b\x79\xa9\xf4\x8e\x50\xef\xc9\x41\x70\x96\x04\x0a\x2f\xbc\x24\x02\xf5\xd3\xc7\xed\xae\x9f\xb1\x33\x86\x19\xbb\x5a\x22\xe9\x64\x0d\x3e\x73\xca\x58\xdf\x67\xb7\x3c\xc7\x17\xe3\xcb\xdb\x14\x45\xad\xb2\x56\x59\xae\x5c\xc3\x50\xb6\x60\x2d\x6a\x2b\x6b\xd7\x30\xbb\xc3\x74\x66\x42\x63\x79\x2a\xd5\xd2\x52\xf5\xea\x74\xe5\x95\x4a\x75\x65\x2a\x69\xb5\xaa\xaf\x18\x57\xa6\xad\xac\x2d\xaf\x55\xa7\x8b\x5d\x7e\x81\x62\x57\xca\x6b\xab\xd3\xf5\x2c\x57\xae\x4c\xb8\x3a\x5d\x60\xa5\xaa\xaf\x2e\xbd\x00\xb2\x33\x29\xcb\xbc\xbd\x38\x33\x52\xe2\xeb\xd5\x74\x22\x12\x80\xaf\x57\x89\x94\x4b\xf7\xda\x0f\x55\xba\x09\x4e\x38\x3f\xf5\xed\x3a\x8b\x23\xa7\x3b\x25\xe9\x69\x94\xe5\xb3\x84\xba\x94\x30\xcd\xe0\xf3\xef\xc1\xe7\x7b\x62\xfb\x36\xf7\xc5\x8c\xfa\xd4\x58\xfa\xf2\x52\xef\xd6\x0e\x55\x5c\x28\x60\xba\x65\x79\x79\xa9\x28\x32\x66\x79\xf3\x4a\xae\xaa\x08\xed\xe3\x37\xc5\xd6\xd0\xba\x38\x87\xb2\xc4\x4e\x57\x29\x3e\x3a\xb8\x5e\x16\x3b\x49\xb1\x1e\x01\x30\x79\xc8\x0d\x11\x52\x28\xb0\x83\x0b\x9a\x01\x37\x44\xe7\x30\x2c\x83\x58\x13\x41\xdc\x21\x9e\x9d\x53\x13\x5b\x3d\x94\x67\xc2\x4d\x47\xae\x30\x31\x2b\x14\xea\x62\x5b\x1f\xbd\x0b\xbf\x14\xaa\x0e\x7b\x59\x87\x14\xe8\x65\xdc\x62\x20\xee\x16\xc3\x01\xd0\x99\xe3\xc3\xc2\x91\x7d\x2d\xe0\x54\xa7\xa3\x8a\x18\x8e\x64\xd2\x8e\xe5\x1e\x48\x63\xfd\xcb\x4b\x55\x40\x9c\x1e\xb9\x18\xed\x0e\x9d\x1e\xb2\x14\x3f\x20\x35\x51\x84\xcb\x56\x34\xdf\xd4\xde\x06\x35\x27\x65\xfd\x1e\x01\x58\x4f\x05\x38\x54\x7b\x21\xc3\xd9\xc2\x7c\x5b\xf8\x08\x62\x40\xd2\xcb\xb6\xf0\x0e\x18\x8f\x01\x3c\xca\xf1\x8f\xa2\x0c\x9d\x28\xa2\x72\x7f\xc2\x1e\x13\x2f\x41\x7c\x78\xf0\x46\x2d\x1a\x80\x1f\xa7\xfc\xdf\x4f\x7c\x57\x21\x1d\x8c\xc6\xd6\x24\xd7\xec\xf1\xbd\x14\xb6\x46\xfd\xd4\x1f\x05\x5e\x1f\x85\x64\x04\x98\x68\xfc\x0a\x3d\x6f\xc6\xe2\x99\xf4\x31\xb5\xf6\x2c\xc7\x9a\x5d\xd4\x2b\x8d\xa1\x13\xa9\x48\x0d\x2d\x67\xee\x5a\x14\x06\xdc\x75\x0d\xf3\x43\x93\x2a\xe2\x5f\xf3\x06\x46\xe9\xaa\x05\x7e\xb9\x02\x1e\x33\x97\x38\x59\xaa\x64\xa9\x9e\x38\xf2\xd2\xe9\x71\x6b\x8e\x5f\x96\x75\x55\x87\x41\xca\x99\x1c\x50\xed\x59\xae\x02\x29\x6c\xc6\xf4\xd6\x06\x63\x60\xd2\x08\xba\xb4\x7c\x10\x84\x7d\x92\x05\x44\xcc\x77\x38\xdf\x8f\x71\x2c\xcc\x1d\xe8\x90\xae\xbb\x2e\x7f\xcc\x1e\xeb\xcc\x27\xe5\xc8\x72\xd6\x1d\x6d\xe8\x0c\xd0\x43\x76\x04\x66\xea\xf0\x5e\x1c\xf6\x28\x0e\x3b\xb5\xf6\xbb\x70\xcf\xd2\xe1\xc0\xd2\x6b\x83\x1b\x7e\x6d\x20\xb6\x6e\x37\xac\x70\x7f\xd0\x65\xde\xfc\x13\x47\x28\xc9\x01\xd3\xa2\x65\x4d\x9d\x90\xd0\xb5\xc6\xe5\xe5\x46\xfa\x30\xf0\xa6\x0e\xdc\x43\x35\x9e\xf6\xb4\x3c\xb7\xf7\xe0\x34\x71\x40\xe1\xaa\x1b\xd0\x53\x31\xdc\x83\x1b\x82\x12\x23\x78\x0f\x00\x50\x8b\x7d\x8e\xf4\x2d\x7e\x03\x35\x3d\x57\x13\x60\xa0\x96\xc9\xa5\xa7\x62\x9e\x14\x62\xab\xcf\xe6\xc2\xf9\x78\x5c\x5e\xaa\x38\x3f\x6f\x50\xdb\x2b\x5a\xe2\x4b\xac\xae\x4e\xa7\x07\xad\xd0\x7f\x79\x79\xa6\x1e\xa6\x98\x9a\xad\xf5\xbc\xc0\x47\x94\x69\x2d\xea\x40\x38\xcc\xb6\xa5\x4e\xc0\x94\x07\x2e\xea\xe2\xda\x0b\x96\x30\x84\xb6\xd0\xcd\x54\x75\xe8\x0b\xaf\x94\xe2\x66\x0f\x82\x64\x2d\x5e\x1c\x1e\xba\x61\x84\x69\xba\x42\x21\x9b\x8f\x14\x09\x43\x00\x9d\xf4\xf5\xc8\x2c\x47\x95\x79\xb5\xd6\x01\xf5\xd4\x31\x75\x76\x1d\x4f\x72\xf9\xf4\x10\x57\x46\xc4\xdb\x4b\x11\xc2\xbb\xd8\x09\x31\x1b\x0a\xf4\xbb\xe1\xd3\x1b\xe7\x8b\x44\x7a\xe2\x85\xb2\xd1\x94\xdc\xdf\xe0\xcc\xbc\xd7\x81\x60\xf0\xef\xfa\xbf\xef\xcb\xa9\xc8\xfb\x7b\x22\x22\x76\x0b\x5e\x4a\x2b\x36\xab\xe3\x96\xab\xfa\x6a\x5d\xa5\x88\x0b\x5f\x42\xb9\xf6\x0a\x6d\x5a\x20\xd4\x63\x5f\x50\x9b\x36\x1f\xfe\x0f\xd5\xa6\x4d\xab\xb6\xa6\xdc\xd7\xbf\xe7\x1a\xae\x42\x1d\x98\x1f\x2f\xd7\xd5\x58\xc9\x9b\xe4\xe8\xf7\x83\xd3\x07\xfc\xc4\x37\x43\xa0\x29\xb8\x3b\xec\x44\x78\x9a\x34\xe4\x37\x0c\x3c\xef\xe1\x54\xc8\xa3\x34\xf9\x78\x27\x4a\xd8\x8f\x8a\xb3\x6e\xf8\xe5\x9b\x7e\x32\x3b\x1c\x85\x82\x8a\xa6\xf4\x3f\x33\x30\xb2\x0e\x0b\x4a\x2b\x3b\x49\xc7\xdb\x12\x9e\x19\xa5\x69\x91\x4a\xbe\xfc\xa3\x64\x6b\x67\x71\x8a\x92\xad\x9d\x27\x2a\xd6\x88\x37\xf6\x38\xf7\x74\xd8\xaf\x89\xc5\x49\xfe\x3d\x05\x73\x7c\x8f\x28\xb3\xaf\x7c\x51\xa0\x33\x63\xc4\x6c\xef\xaa\x75\xa8\x10\x10\x22\x48\xce\x83\x39\x94\x31\x51\xd2\xd3\x81\x8d\x71\xe8\x1e\x8c\x30\xda\xde\x65\x76\x04\x0a\xf3\x2e\x4c\x58\xc1\x0c\x00\x46\x44\x85\xcc\x20\xd1\xdc\x2c\x14\x43\xd7\x3f\xa0\xcc\x84\x12\xf9\x5c\x01\x46\x06\xda\xcc\xc8\x73\x85\xb0\xcf\x19\x91\xe8\x0c\xa3\xd0\x77\xbc\x36\x8a\x82\x51\xd8\x43\x51\x1b\x7d\x6c\xe4\xd2\x4b\x2e\x14\x1c\x8e\x90\x42\xaa\x98\x59\xf9\x44\xa9\x00\x9f\x4c\xcb\xf4\x12\x90\xa9\x3b\x29\xf2\x16\xcd\xb9\x77\xcf\x48\x52\x4b\x7c\xff\x42\x2d\x14\x77\xc5\xe4\xdc\xc3\xa2\x86\x60\x0c\xc3\xf8\x06\x19\x0c\xc3\x59\xd7\x06\xd5\x7a\x47\x44\xf8\xc0\xd6\x08\x1f\x96\x56\xa1\x52\x44\x7e\x2f\xe8\xa3\xbd\x76\x93\xac\x46\x03\x9f\xf0\x55\x71\xcf\x42\x8c\x7c\x08\xb4\x48\xbc\x77\xc4\xf8\xb1\x5f\xc5\xa1\x11\x44\x92\xf8\x6d\x65\x9d\x26\x67\xbc\x45\x67\xfd\x79\x2e\x83\xd9\xe5\xc9\x09\x15\x78\x91\xcc\xec\xe6\xa2\x0e\x07\x08\xe7\xe8\x7c\x87\xa9\xd2\xc8\x7a\x74\x66\xee\x29\x34\x5f\x38\xfb\x54\xaa\x31\x17\x63\x7c\xba\xe4\xab\x90\x15\x9f\xaa\xfa\x56\x1d\x14\x0a\xbe\xb4\xd4\x83\x58\x35\x56\x89\xdc\x2d\xd3\x29\xb3\x49\x14\xcb\x3a\xd4\x91\xcc\x96\xeb\xa3\x3a\x81\x45\x21\x59\xcf\x5c\x78\xe2\xdb\x4c\x7c\x7a\xf2\x10\x48\xd6\xd5\xe9\xb8\x40\x3e\x8f\xb3\x2c\x27\x7d\x9a\x27\x9d\xb8\xad\xa7\x8e\xe4\x44\xf2\x38\xc3\x31\x59\x46\xed\x77\x61\x5d\xb4\xda\xa2\x5a\xb7\xb0\xe6\x93\xd9\x19\x00\xad\x1f\xf8\xa8\x06\x7c\xe1\x33\x8f\x2d\xe2\x99\xbe\x22\x90\xdc\x31\xbd\xf7\xbd\xed\x56\xa2\x1e\x96\xee\x4f\x7f\xa4\xc6\x64\x55\xd2\xb5\x64\xa2\xfc\x5b\x90\x2d\x1f\x13\x3e\x66\x5d\x8c\xc5\x17\x9f\xb8\x72\x65\xcd\xc7\x74\x71\xc5\xb1\x9f\x2f\x72\x26\x39\xe5\xde\x50\x04\xf1\x15\x50\xd4\xc3\x27\x0c\xaf\x80\x8a\x86\x8e\xaf\x00\xa1\x8b\x9e\x80\x89\x1d\xc8\xc5\xba\x44\x26\x4e\x22\x76\xf1\x1b\x1d\x41\x27\x6e\xe4\x1e\xb8\x9e\x8b\xcf\x2d\xe5\xc8\xed\xf7\x91\xaf\x40\xd9\x9f\x27\x53\x1b\xb6\x6c\xe9\x23\x15\xbf\xeb\x7e\x1c\xf1\x58\xaa\x6c\x9c\xf6\x8d\x6a\x29\x7a\x92\x1d\x57\x08\xa0\x61\xe9\xed\x3c\x04\x20\xbb\x0c\xcd\xd7\x76\xef\xda\x5b\x5b\xec\x4a\x1f\x61\x06\x64\x19\x89\x2e\xa1\x11\x5f\x0b\x28\x15\x80\x73\x0a\x10\x61\x27\x28\xc4\x6e\xcf\xf1\xb8\x3f\x57\xa1\xb1\xaa\x90\x29\x6c\x6e\x25\xc3\x39\x95\x0c\xa7\x71\x08\x73\x70\x48\x2f\xef\x73\x9b\x31\xde\xa5\x54\xee\x50\xe2\x2f\x90\x00\x85\x8a\x81\x72\xda\x30\x1b\x80\xc5\x82\x1f\x73\x35\xe7\x4e\x30\x2c\x85\xc9\x7b\xb1\x5c\x43\xa9\x1d\xcf\xe9\x1c\x5e\x12\x9d\x84\x97\xdf\xe1\x6e\x62\x85\xa7\xe2\x19\xa4\x8e\x46\x43\x14\x2a\x7c\xc7\x57\x46\x13\xa5\xd0\x8c\xef\x1f\x96\xb1\x45\x00\x5e\x88\xa6\x32\x1d\xc8\x54\x69\xcd\x68\x2c\xdb\x54\x5d\x39\x06\xe5\xe6\x2c\x2a\x74\x29\x22\x5a\x50\x94\xca\x58\xb2\x65\x59\x09\x1f\xd8\x47\x5d\x61\x4b\x27\xbe\x79\xac\x3c\xf2\x89\x78\x02\x53\x40\xb1\x00\xfe\xde\x4f\x22\x3b\x61\x70\x76\x9e\xa3\x3a\xa4\xbf\xb0\xee\x10\xcd\x60\x9a\xa1\x52\x86\x7d\x76\x2e\x54\x80\x33\xb7\x94\xd1\xf3\x82\xf8\x36\x3b\x0a\x39\xf7\x4a\x43\xc9\x70\xa1\x3e\xb5\xe5\x26\x6e\xa2\x2a\x14\xa6\xe3\x52\xd7\x65\xad\x2b\x07\x5e\x70\xa0\x98\x0a\x59\x59\x2b\x30\x9a\x93\xd7\xfa\xf4\xcd\x58\xf4\xd4\xec\xe1\x66\x70\xec\xb8\xbe\xb8\x2c\x8b\x6e\x45\x4e\x0b\xb7\x24\x58\x9e\x4f\x32\x37\x7f\xb9\x87\x6a\x59\x27\x5d\x83\x2a\xa5\xe1\x51\x44\x7d\x35\x53\xa4\x88\xa0\x02\x42\x35\x8a\x2f\x07\x93\xf6\x29\x6d\x2a\x52\xdf\x72\x3d\xd4\x46\x4e\x1f\x85\x35\x5b\x73\xfa\xfd\xc6\x09\xf2\xa9\x5b\x76\xe4\xa3\x50\x55\x08\x2a\x4a\x8e\x81\x0d\x59\xf7\x87\x28\x1a\x79\x18\x8c\xe1\xa2\x01\x60\x5e\x62\xae\x1d\x98\x27\xec\xab\x76\x9c\x2e\x44\x4e\xdf\x8e\xc4\x35\x81\x12\xaa\x6c\x4f\xd4\x67\x93\x00\x79\x95\x2b\x42\x86\x3b\x18\xc3\x28\x16\xf5\x7d\xf2\x3e\x44\xbe\xaa\xdc\x6e\x74\x14\x88\x8b\xca\xfa\x28\xf4\xac\x5c\xb9\xde\x06\x45\xa5\x20\xdf\x97\x66\x29\x45\x07\x40\x46\xb3\x45\xcb\x72\x0a\x85\x39\x04\x2f\x14\x64\x3c\x48\x6a\x87\xf4\x7d\xba\xba\xe0\xb7\x50\x0a\x77\xf0\xe9\xd0\x5a\xa4\x61\xf6\x66\x05\x14\x73\xf1\x35\x4d\x5f\x5a\xeb\xf1\x98\x2c\xce\xfc\xbe\xfa\x02\xeb\x0b\x26\x6e\xf1\x21\xeb\x44\x91\x3b\xf0\x2f\x2f\xf3\x6f\x36\x30\x6a\xe8\xc6\xd4\xc5\x28\x48\xc8\x6c\x92\x33\xcd\x7d\xd4\x4d\xae\x0e\x59\x70\xfd\x05\x0c\x78\x01\x89\x6e\xe5\x91\x13\xb5\x4e\x7d\xc1\x1d\x98\x16\x23\x11\xb7\x0a\x05\xd5\xde\x0f\xbb\x16\xde\x0f\xbb\xc9\x65\x9f\x63\xe8\x5b\x91\x8a\x55\x63\x89\xde\x34\x40\x5f\x97\xf9\x55\x03\xe5\x55\x49\x71\x25\x7a\xa9\x3b\x06\x82\xdc\x63\x5e\x74\x79\x79\x31\x86\x51\xe6\x0e\x23\xe5\x20\x08\x3c\xe4\xf8\x89\x9a\x32\xa6\x7b\x4c\xae\x3f\xb8\xbc\x8c\x5f\x41\x2d\x62\x5b\x4e\xb2\x4a\xa7\xa1\xe9\x9a\x5e\x72\xbc\xe1\x91\xa3\x19\x86\x22\x5c\x71\x66\xf6\x8f\xa9\x28\x13\xcc\xe0\x54\xca\x4e\x18\x9c\xb8\x7d\xd4\x5f\xe0\x3b\x3c\x0b\x6e\xb4\x40\x84\xc0\x53\x17\x1f\xb9\xfe\x82\xb3\x20\xb2\x51\xc4\xb1\x55\x20\x9f\xa0\xc0\x9e\x75\xe1\x44\xe7\x7e\x8f\x2c\xa7\x1c\xcf\x0b\x4e\x3b\x8e\xeb\x63\x73\xd1\x80\x59\x2d\x17\xe5\x3f\x1e\xd2\xff\x14\x28\xf7\x41\xd3\x58\x42\x15\xc8\x6b\x49\x32\xa1\xdc\x92\x1d\xcc\xf0\x79\x8d\xf9\xdb\x44\x21\x89\x4d\x6d\x7f\xb4\xe9\x86\x1b\x4d\x67\x40\xba\xaf\x63\xba\x5a\x1f\x9d\xb8\x3d\xb4\xe3\x9e\x21\xaf\xed\x60\x37\xb8\xbc\x34\x20\xa6\x46\xc4\x66\xda\x63\x37\x16\xf6\xbe\x70\x14\x21\xc2\x18\x49\x2e\xd2\xbe\x9a\xe9\x4a\x3e\xfd\xa1\xbc\x91\x26\x62\xf8\xb6\x1a\xdf\x42\x33\x5d\xf9\x0c\x89\x87\x3e\xe2\xa1\xfc\x14\x69\x0c\x3d\xb2\xf6\x73\x34\xb6\x57\xc8\x45\x51\xb2\xfa\x0b\xd5\x8b\x31\xec\xd1\xdd\x91\x78\x59\xe5\x8d\x6b\x81\xc6\xcc\xe7\xdb\x7c\x6f\xd1\x8a\xf1\x87\xb6\x86\xce\x86\x41\x88\x23\x2b\x78\x15\x1a\x6b\x12\x7e\x33\xd7\x5f\x53\xd7\x01\x0b\xfb\x99\x8c\x01\x74\x62\x29\xe3\x1e\xaa\xbb\xe7\xc7\x07\x81\xa7\xb9\x18\x85\x0e\x0e\xe8\x38\x66\x08\x4a\x80\x79\xc3\x87\xde\x7a\xb2\xa8\x43\xdf\x5a\x34\x92\xd5\x2a\x0e\xcf\x63\x56\xe2\xc0\xc8\xb2\xf7\x33\xf9\x77\x55\x50\x5b\x54\x43\x4b\x75\xac\x28\xb5\xaa\x25\x2c\x81\xdf\x9c\xe2\xb0\x75\x2d\x80\x8b\x88\x8e\x39\xca\x82\x16\x2d\xea\x70\x98\x2c\xf2\x6a\xc9\xf5\xcb\x3e\x41\xa1\x6e\xd9\xe3\x43\xd7\x77\x3c\xef\x9c\x5e\x39\xbc\x18\x16\x0a\x84\x05\x13\xdc\x93\x37\x15\xc4\x40\xee\xa1\xea\xf3\xc5\x44\x3d\x5e\x10\xe2\x31\xad\x5e\x2d\x77\x2d\xd6\xf4\x4f\x1c\xcf\xed\x2f\x38\x18\xa3\xe3\x21\x5e\xc0\xc1\x42\x1f\x45\x38\x1c\xf5\xf0\x28\x44\x0b\x7e\xe0\x97\x68\x0d\x0f\x3c\x14\xcf\x0c\x84\x43\xd3\xd5\xa2\x7a\x4f\x30\x32\xac\x96\xd7\x28\x6b\x23\x21\x4b\x06\x65\x6d\xe4\xb5\x5c\xa1\x8a\x7c\x14\x4e\xa7\x9a\x7c\xf4\x50\xdb\xb5\xb0\xba\x54\x05\xb0\x47\x3e\x97\x00\xf4\xd8\x1d\x73\x23\xeb\x9e\xea\x49\xdc\xf0\xde\x4b\xa8\xf1\xa5\x7b\x52\xc6\x36\xe4\x1e\xe0\xd7\x22\x64\x0e\x69\xe1\x1e\xd7\xd9\xe3\x27\x67\x58\xec\x53\x43\xf1\xf6\x88\xae\x71\x92\x4d\x70\x9c\xda\xea\x06\x70\x60\x9d\x6a\x42\x44\xe7\x85\x53\xa1\x67\x14\x8f\xff\x29\x3d\x8f\xa9\x04\x20\xbb\x47\x0d\x4c\x4f\xa3\x9a\xaf\x3b\x76\xbb\xb1\xdd\x81\x1b\xd6\x29\x5d\x2d\x5e\x9d\x33\x81\xba\x32\xbb\xbe\x85\x2c\x2b\x07\xef\x81\xe6\x46\x54\x5b\x96\x1d\x67\xaa\x60\x7d\x63\x2a\x04\x67\x33\xcf\xe0\x84\xa7\x0b\xa7\xb7\x44\x6e\x98\x03\xf3\x5d\xa6\x15\x0e\xb6\xb1\x96\xcf\x95\xd7\xa7\x8f\x8f\x73\xef\xc0\xcd\xbb\x55\x37\x7b\xb8\x10\xc5\xfd\x2d\x5a\x57\x47\x5c\x23\x51\xf4\x96\x0d\x8f\x08\x5d\xac\x43\xc1\x45\x1d\xda\x00\x70\xdd\xab\x5b\x81\x8f\x23\xf5\x34\x9b\x5b\x9c\xd9\x88\x96\x39\x0a\x7b\x68\x2b\x20\x32\x27\x15\xfe\xce\xd5\xe9\x3b\x86\x81\x24\xa2\x26\xaa\x65\xa3\xa9\x1e\x03\x43\xd2\x7e\xd2\xfc\xe8\x5b\x61\x6a\x5a\xa8\xf3\xef\x47\x62\x9a\xb0\x94\x3b\x9d\xbb\x5b\x0a\xd5\x78\xe1\x17\x06\x5d\x5e\x2a\xf5\xd6\xe6\xa3\x54\x18\x53\xa3\xa0\x0b\x29\x51\x6d\x7a\x57\x88\x7a\xca\x95\x23\x52\x47\xd7\x88\x3a\x79\x87\xae\x25\xd4\x1b\x7b\x96\x38\x2b\x83\x9e\xc5\xad\x28\xf7\x2c\xaa\x7f\x94\x5c\x40\xc4\x86\xaa\x3a\xa5\x9f\xda\x87\xec\xd0\xcb\xbc\xc7\x67\x59\xcc\x8f\x54\xce\xcc\xa9\xbb\x41\xb0\x76\xb6\x8e\xb5\x33\xd3\x83\xe7\x79\x91\xe7\xeb\x58\x3b\x37\xf7\x20\xc5\x2a\x0f\x80\x46\xac\xf3\x5f\x33\x31\xf4\x74\x01\x64\xf8\xe7\x25\xe2\x6a\x6d\xe2\x45\x4a\xd6\x03\xa9\x29\x3d\xcd\x33\x52\x73\x7a\x9a\x81\xc4\x93\x7a\xc2\x79\xc4\x84\x1e\x73\xa0\x31\x57\x4c\x71\x99\xf6\xc1\x03\x9a\x1c\xa8\xa7\x70\x0f\xb2\xae\x68\xe7\xdc\x54\xcd\x44\xde\x50\xb5\x21\xdd\x49\x46\xfb\x7a\x17\x46\x16\xda\x37\xba\xd0\xb5\xd0\x7e\xb9\xcb\x35\x9a\xa9\x3a\xc2\x76\xd0\x47\x3b\xa4\x5d\x43\xa0\x46\xd0\x85\xf7\x00\x6d\xb4\xb4\x78\x27\x7c\x5a\xd2\x8b\x70\x7a\x42\x58\x9a\xba\xe0\x25\xe7\x4c\xee\x65\xc0\xad\x14\xab\x02\xd0\x15\x43\x65\x56\x15\xc9\x48\xe9\xc9\x1b\x96\xea\x9e\x50\x07\xd8\x9b\x3b\x42\xdc\xcc\x08\xf1\x92\x11\x12\xe5\x8c\x90\xe8\xdd\x8d\x90\x08\xfa\xd0\x25\xd3\x84\xc7\x47\xc8\x86\xe5\x89\x11\x72\xcb\xf2\xd8\x08\x69\x58\x1e\x75\xb0\x70\x68\xe5\x8c\x09\xc9\x7e\xd9\x44\x4c\xa6\xdd\xc5\x41\x88\x4c\xfb\x5d\x0c\x97\x5b\xf3\x86\x4b\xe3\xe5\x87\xcb\xe0\xdd\x0d\x97\x0d\x30\xae\x4d\xc9\x6f\x58\x63\xf2\x33\xc8\xae\x21\xe8\xda\x8a\x47\xce\x72\x53\x96\xb1\x76\x82\x87\x40\xb0\x99\x11\x18\x73\x4d\x9d\xa3\xcc\x92\x48\xe4\x99\x02\xe6\xfd\x7c\x91\xee\x39\x69\x99\xa5\x41\xa1\xe0\x48\xba\x3e\xe9\xaf\x8c\xfa\x22\x3c\x22\xe3\x96\x8d\xb2\x57\x72\x4c\x96\x0c\xda\xb4\xdc\xec\xaa\x58\xad\xe8\xd4\xb2\xc2\x8d\xef\xb6\x73\xa5\xbb\xed\xca\x06\xbb\xdc\xce\xa8\x32\x79\x4c\x5e\x7f\xba\x2f\x21\x71\x49\x08\xe4\x29\x5c\xb1\x3b\x29\xd3\x6b\x21\x76\xf3\x1b\x44\xb0\x5e\x2c\x02\xbe\x44\x8d\x95\x42\x55\x87\xc5\x12\x41\x58\xac\x4c\x54\x1b\x3a\x30\x82\xd4\x0f\x4b\x34\xe6\x77\x51\xee\x2b\xbb\x1b\xed\xe6\x4e\x47\x81\xca\x9d\x86\xbd\xa9\x40\xa5\xd3\xec\x6c\x35\x14\xa8\xb0\x09\x5f\x81\x4a\xbd\x4d\xbe\x76\x3a\xcd\xd6\xb6\xd2\x95\xb4\xa0\xb8\x3c\xe8\x42\x0f\x9e\x26\x7b\x03\x7b\x70\x60\x21\x49\xb5\xaa\x36\xa8\x0d\xac\x3d\x70\xb1\x67\x0d\xa8\x28\xbf\xeb\x1e\x78\xae\x3f\xa8\x31\x1d\xbc\xc1\x6c\x45\x3f\xd2\xa9\x07\xf2\x0e\xca\x06\xd5\xbd\xbc\xbc\x4c\x05\xb2\xa0\x0d\xde\x77\x0a\x85\x4c\x0a\x16\x4c\x13\x82\x81\xd6\x77\xb0\x93\xd5\xdd\x2b\x14\xf0\x8b\xde\x33\x35\x80\x98\x2b\xe9\x2d\x4c\xe3\x46\xf8\x1d\x97\x28\x32\x28\xa6\x62\xae\xc2\x54\x02\x06\xec\x82\x42\xcb\xb2\x7a\xf1\x05\x85\x03\xcd\x0f\xfa\x88\xdd\x50\xc8\x35\x05\xd3\xbd\x62\x00\x31\x69\x0f\x7e\x73\x6f\x5f\x73\xa3\xfb\x6e\xe4\x1e\x78\x48\x05\xe0\x42\xa1\x76\x2d\x84\x03\x0f\x64\x0e\xec\xe4\x18\x70\x00\x75\x00\xfb\xc0\x54\x3a\x8d\x87\x1d\xbb\xdd\xb0\x67\x26\xca\xe8\xd8\x8b\x74\xbb\x8d\x2d\xd2\x7b\x66\xa5\x4a\x29\xd8\xf3\x34\xfd\xec\xad\x88\x85\xc2\x54\x50\xfa\x22\xb2\x45\xcb\x0a\xa6\xdc\x66\x6e\xb7\xb6\x1b\xf4\xda\x8f\x28\xff\x4e\x46\x5a\x1a\xe4\x7b\xbd\xb7\xac\xa4\x86\x8b\x12\xae\xb0\x61\x8d\xd4\x3e\x1c\x50\x2a\x36\x2e\x2f\xef\xa9\x7d\x4e\xf0\x43\xab\x71\x79\x49\xe8\x2a\x8c\x0a\x51\x5f\x05\xeb\xae\x36\x40\xb8\x8d\x1c\x6f\x87\x36\xe3\x2e\x76\x7a\x4f\x5c\x7f\x20\x54\xa6\x80\xe9\xc2\xa3\xcc\x08\xed\xc3\x43\xd8\x00\xb5\x43\x3a\xa1\xa3\x33\xcc\xfb\xde\x11\x80\xb7\x0a\x05\x9b\x22\x79\x44\x87\x16\xdb\xc3\x74\x59\x2f\x0d\x11\x3f\xd7\xed\x4b\x70\x6c\x08\x8e\xb9\x35\xc4\x74\xdf\xdc\xbd\x7f\x7b\xf7\xfe\xed\xfc\xde\x99\x89\xbb\xaa\x7f\xa6\xc0\x19\x45\xee\xcc\xec\x82\x70\x68\x8d\xd4\x3b\x9c\x8a\x43\x42\xc5\x3b\x9c\x8a\xdb\xd6\xf0\xf2\xf2\xce\xbb\xa0\x62\x33\x43\xc5\x3b\x70\x1b\x0e\x41\x6d\x3b\x43\xc5\xe6\x0c\xaa\xdd\xa1\x86\xe7\xa3\xcc\x5e\x5f\x2c\x4d\xbb\x51\x3b\x08\x44\xb7\x54\xc1\xe5\xa5\x9d\x42\xf1\x81\x8b\x8f\x3e\x4c\xad\x3c\x58\x1c\x3f\xd5\x67\x1e\x39\x6e\x18\x0c\x3c\xb6\x91\x24\x55\xba\xbc\x3c\xa5\x45\x8c\xe1\xbd\x7c\x2b\x8f\x34\x05\x58\x0e\xf4\x9e\x41\xaa\x55\x95\xbd\x0b\x2a\x36\xc4\x4a\xd6\x1a\x82\x1f\x90\x09\x86\xb5\x91\xdc\x6e\x71\xab\x24\xd1\x57\x8a\x8d\xd9\x75\xea\xab\x51\x30\x85\xfe\x1f\xa3\x56\x00\x53\x47\xa9\xa9\x21\xd5\x45\x09\x33\xba\x28\x6b\x53\x4e\x67\xff\x95\x3d\x73\xc4\x6b\x0d\x61\x6b\xc0\xfa\x44\xec\xa2\x8e\x8f\x39\x7a\xf3\x39\x0d\xe0\x83\x2d\x0e\xc0\x21\x72\xb0\x1d\x91\x31\x9d\x19\xcd\x56\x38\x4e\x0e\x72\x84\xbe\xc1\x60\xb6\x7f\x9b\xb4\xf7\x48\x86\xc7\x7a\x1a\xc9\xf4\x78\xbc\x26\x01\x6a\x49\xc6\xaa\x70\x72\x98\x9f\x4a\x3e\x73\x9d\xc9\x89\x66\x22\xb7\x28\x95\x79\x79\x79\x05\x05\x28\xf6\x66\x06\xcb\x39\xdc\x2f\x4f\xe9\xd1\x79\xaf\xc7\x66\x92\xf5\xbf\xa2\x75\x0b\x77\xad\xc4\x3e\xb8\x2e\x04\xfe\x77\x36\xf4\xde\xb2\xa1\x65\xb6\x82\x59\x79\x21\x33\xa8\xda\xf4\x11\x19\xc4\xa9\x05\x63\x24\xb9\xc7\x38\x2b\xaa\x48\x3b\x2b\xd9\xda\x19\xb8\x86\xa9\xe7\x50\x15\x69\xe7\xd4\x0f\xf1\x35\x0c\xc6\xd0\x9d\xc7\xe0\xa0\xff\xfe\x5a\x52\x9d\x0f\x91\x55\x9f\x76\xb9\x2a\xfb\x1b\x92\x5d\x02\x71\xf7\xa9\x82\x05\x26\x0e\x55\xad\x30\x0e\xb1\xfc\x1c\xde\x16\x8d\x0e\xfa\xee\x89\x9b\xe3\x09\x51\xd2\x50\x0d\xd4\xa4\xa4\xe9\x42\x99\xfd\x94\x0c\x23\x22\x32\xb8\x10\xc0\xba\x00\x94\x82\xc5\x37\xb5\x3e\xb1\x02\xea\xb3\x13\x91\x0e\x10\xa8\x3e\xac\x93\x57\xd7\x0a\x54\xba\x4a\x4c\x3c\x9d\xad\x4b\x4e\x92\x18\x62\x21\x74\xa0\x0b\x4c\x16\xee\xc2\x08\xd6\xe3\x9c\x65\xa7\x6d\xd4\x2f\xe2\x6c\x46\x9e\xf2\xbd\xd4\x87\xb9\xb8\x4e\x57\x52\xf8\x65\x9a\xe6\x85\xee\x2b\xb2\x30\x4c\x19\xc5\x67\xf4\x52\xfe\xfd\x60\xed\xdf\xf8\xc1\x5a\x9d\x79\x1d\x72\xac\x1c\x91\x2b\x87\xc5\x45\xcc\x8b\x50\x89\xba\x0c\x82\xf4\x35\xed\x4e\x28\xfb\x99\xf6\x2d\x74\x85\xff\x84\x85\x68\xca\xc1\x90\xb0\x26\x9f\xf6\x28\xc4\x9c\x58\x94\x94\x22\x2a\x2a\x25\xe6\xce\x56\x01\xcc\x72\x8f\x7a\x34\xa5\x59\xc5\xe7\x1a\x5c\xa5\x0d\xc0\xd0\xf2\x55\x0c\xa9\xb1\x6b\xc8\x36\xaa\xc3\x7d\xa3\x3b\xa5\x02\x16\xad\xef\xd7\x61\xbd\x6b\xee\xd7\x61\xd4\x7d\x85\xfe\x8a\x36\x9b\xbb\x3b\x5b\xf6\x23\xee\x72\xc6\x80\xf5\xad\xd6\xc6\x6b\x66\x19\x36\xb7\xa9\x5b\xcb\x2a\x6c\xef\x6d\x3f\x6e\x6e\x9b\xab\xf0\xd6\x56\xeb\x81\x69\x2c\xd3\xdf\xc7\xed\x56\xab\x63\x56\xca\xb0\x63\xd7\xb7\x1a\xe6\x72\x15\xde\xda\x6a\x3c\x34\x8d\xf2\x2a\xbc\xdd\x6e\x6e\x9a\xe5\xa5\x65\xd8\xde\xab\x3f\x32\x97\x8c\x32\xdc\xdd\xab\xd3\x40\x43\x2f\x57\x21\xdd\x0d\x68\x76\x1a\x77\xcd\xb2\x5e\x5d\x65\xe9\x1f\xb7\x5b\x0f\x1e\xdf\x6e\xb7\xf6\x76\xcc\xaa\xbe\xb6\xcc\x03\xef\x34\xec\x4d\x7a\xb9\x22\x09\x5f\x35\xd6\x78\x61\x8f\x6f\xb5\x5a\x9d\x38\xdc\x58\xae\xac\x56\x93\x5c\xcc\x4a\x79\x65\x59\xe4\xba\xd1\xd8\xda\x32\x97\x97\x96\x2a\x22\xc7\x8d\xd6\xd6\xde\xdd\x6d\x91\xf2\xc6\x0d\x63\x25\x15\x41\x83\xe2\xc4\x36\xdd\x50\xa3\x61\x6b\xb4\x2e\x8f\xeb\xd4\x11\xcf\x8d\x1b\x65\x9d\x7d\x77\x1a\x0f\x3b\xf4\xdb\x48\xe2\x1f\x6f\xb4\xb6\x3b\x76\x73\xbb\xd1\xa6\x31\xe5\x04\x32\x13\x53\x81\xe4\xbb\xb1\xdd\xd9\xa5\x9f\x55\x4e\xf0\xc7\x8c\xfe\x24\x68\x49\x04\x25\x24\x23\xc1\xcb\x22\x98\x91\x9e\x04\xad\x88\x20\xd6\x08\x37\x6e\x94\x57\x45\x08\x23\xfc\x8d\x1b\xe5\xb5\xb1\xcc\x0d\x53\xab\xea\xcb\x79\x9e\xa7\xbc\xa0\xf7\x44\x76\x3a\x45\xd0\x63\x0e\x80\xd8\xe6\x8d\x14\xc7\x8a\x64\x91\xe1\xc8\x2f\xb9\xbe\xec\xab\x89\x76\x23\xee\x88\xc9\x0b\x4e\x65\x3f\x4c\x5b\xad\x07\x49\x44\x29\x0c\x02\x9c\x89\xa5\xdd\x8d\x81\x50\x39\x4c\x8a\xa6\x54\x10\xa9\xd1\x59\x2a\x61\xe3\x21\x8b\x18\x84\xae\xec\xf7\x89\xd0\x44\x60\x79\x70\x9e\xc2\xb1\xfe\x88\xfb\x83\x1a\x1d\x64\x12\xf1\x4e\xcc\xdd\x23\xb9\x11\x26\x1c\xed\x58\x76\x8f\x24\x5a\x49\xc2\xb3\x14\x06\xa7\x25\xb2\x72\x1f\x66\x31\x4e\xba\xbc\x0c\x7e\x44\x95\xf4\x66\xa4\x90\xc7\x83\x9c\xe8\x30\x08\xf0\xcc\x44\xf2\x60\xc9\x20\x96\x87\x92\x0c\xd2\x43\x9e\x37\x05\x43\xc6\x54\x0a\x28\xf0\x46\xc7\xfe\x8c\xc2\xe5\xf1\x36\x9d\x68\x06\x78\x0a\xd0\xa1\x16\x92\xd3\x90\x6c\x70\x26\x8d\x58\x3a\x48\xfb\xaa\x8a\xc7\xa3\x04\x42\x17\x86\x19\x10\x32\x30\x33\xb9\x94\xe2\x85\x67\x5e\x7e\xc9\x28\xce\xe4\x3c\x3b\x59\x7a\xf0\x73\xe7\x59\x64\xcd\xe8\xe3\x48\x76\x9d\xc5\xd9\x81\x3c\xb8\x4a\xd9\xe1\x27\x33\x89\x14\x60\x5e\x8f\xcc\xb2\x8f\x54\x82\xec\x38\x92\x99\x4a\x0a\x30\x33\xaa\x24\x4e\x93\x02\xcb\x0c\x17\x89\xfd\x64\x3c\x81\xa9\x08\xc4\x2e\xcb\x36\xdd\x68\xe8\x39\xe7\xf9\x3b\x6f\xd2\x4c\xca\xef\x4a\xf7\xa1\xfe\xea\x26\xc2\x5b\x5b\x2d\xbb\x93\x78\x5e\x6b\xdc\xea\x98\x06\xf7\x68\x28\x66\xc3\xc7\xbb\x1d\xbb\xdd\x31\x2b\xe2\xb3\xb1\xbd\x29\x39\xb1\xdb\xd8\xdd\xa5\x1b\x83\xf3\x5c\xaf\x51\x69\x44\xe2\x19\x8d\x5b\xa2\xfb\x51\xa9\x45\xea\x39\xa4\xe0\x14\x81\xa9\x5c\x3d\x4d\x61\x8a\x52\x0a\x10\xf9\x39\x0d\xd1\xd8\xde\x7c\xb5\x1e\xd9\x04\x15\x6e\x05\x3e\xce\x69\xcf\x8b\x44\xf9\xdd\x4c\x19\x36\x08\x1d\x78\x53\x32\x68\x88\x5d\xca\x8b\x40\xea\x5e\x5e\x72\x2e\xcf\xc3\x85\xab\xf9\xc4\xd1\xbc\x39\x87\xf6\xc2\x3f\x22\x27\x43\x55\xd7\x19\xd9\x0e\x02\x2f\x21\xd8\x8a\xae\x8f\xd9\x59\x3b\xad\x4d\xd3\xc7\xaa\x0d\x8d\xe4\x90\xce\x8d\xb6\x9d\x6d\x15\x81\xf5\xaa\xae\x9b\x68\xac\xda\x92\x97\xfb\x57\x70\xd5\x17\x27\xea\x96\xec\xfc\xc3\xca\xf8\xc7\x17\x15\xb3\x2c\xcb\x16\x4b\x12\xb6\x00\xe2\x95\xa0\xbd\x52\xb5\xa7\xeb\xa0\xbf\xf7\x5e\x5f\xe2\xe1\xc4\xf8\x54\xbb\x61\xbf\x16\x3b\xc1\x8c\x4d\x34\x76\x3b\xed\xe6\x46\xc7\x54\x78\x21\xf1\x08\x8a\x8d\xf7\xe6\x0d\x21\x9e\x48\x76\xd5\x48\x72\xfb\xd7\xf1\x81\x29\x96\xa0\x77\x99\xe9\xcd\xbb\xf5\xa7\xfa\x52\xfe\x51\x79\x59\xef\xad\x7b\x54\x66\x3b\xf4\xbe\x79\x47\xb5\x2e\xee\x37\x77\x9b\x44\x7e\xd5\xe1\x9d\xe6\xe6\x66\x63\xdb\x34\xe0\xee\x46\xbb\xb5\xb5\x65\x96\xa1\xbd\xd7\x69\x49\x8e\x2d\x85\x97\xd4\x79\xbd\x82\x1b\x8b\x25\x0d\xce\x72\xe5\xd2\x1c\xd5\x2d\x92\xbb\x0c\x2d\x89\xbb\x0d\x1d\xe1\x40\x76\x19\xba\xd7\x69\xb1\x88\x13\x76\x2e\x9b\xd3\x99\x38\xee\xe3\x57\xe9\x32\x69\x97\x5e\x08\x31\xdd\xa3\xf4\x97\xe9\x51\xd7\x3f\xa2\xee\x17\x4b\xdd\xcb\xd7\xfb\x97\xaf\x6b\xe0\x4f\xae\xbb\xb5\xe9\x12\xa6\xb9\x89\x8f\x28\x2f\xb9\xbc\xa4\x63\xcd\x1f\x24\x5a\xf4\x31\x7f\xa1\xaa\x8a\x89\xb5\x81\xa2\x40\x6c\x2d\x1a\x30\xb4\xf6\xbb\xcc\xf2\x35\xb2\x74\x18\x58\x54\xc5\x21\xb5\x99\x88\xa4\x0b\xc2\xfe\x7f\xf6\xfe\x45\x2b\x71\x65\x6b\x18\x86\x6f\x45\xf3\x3f\x9b\x95\x5a\x94\x08\x88\xdd\x76\xe8\x6a\xfe\x4a\x00\xc5\x03\x8a\x4a\x77\xdb\x34\xdb\x11\xa1\x88\x59\x62\xe2\x4a\x82\xd1\x25\x5c\xc7\x77\x29\xdf\x05\xbc\x37\xf6\x8d\xaa\xca\x99\x70\x52\x5c\x7b\xed\xf7\xe9\x1e\xa3\x2d\x92\x3a\xcf\x9a\x35\x4f\x35\x6b\xa6\x62\x71\x83\x46\x84\x48\x11\x00\x24\x33\xe1\xb9\x42\x58\xf4\x9c\xcd\x02\xa4\xfd\x4c\x60\x2f\x66\xd3\x09\x9a\xf3\x3e\x54\x61\x66\x32\xde\x49\xe2\x0b\xfb\x8a\x87\x64\x42\xef\x33\x1d\x12\xd5\xb6\xc7\xe3\xbc\xf7\x7c\x25\x51\xb5\x9b\x3e\xdf\x0c\x47\x96\x64\x75\x8a\xf4\x61\x02\xa0\xc5\x04\x8f\x1e\x61\xd7\x89\xbd\xd8\x3b\xde\x54\x26\x70\x88\xf2\xe5\xe1\x67\x3f\x8c\x5a\x79\xe8\xdb\x99\x47\x08\x77\x86\xdd\xb2\x87\x94\x23\x0f\x29\x45\x41\x22\x59\x34\x82\x76\x36\x1b\xf9\xb0\x83\x00\xfc\xd7\x5b\x5b\xd1\xd7\x50\x90\xb8\xe2\x2f\xea\x22\x80\x3d\x11\x00\x56\x2c\x5a\x64\xc3\x2f\xa2\x8b\xb1\x4c\x7f\xe1\xa3\x31\xbe\x32\x19\x35\xe7\x10\xdb\x11\x47\xcc\x76\xc4\x4c\xd7\xb4\x4a\x60\xd1\xf1\x7a\x81\x79\xf6\x49\x2b\xff\xbb\x29\xa3\xe1\x50\x32\xde\x0d\xb1\x83\xf0\xb4\x6f\xa3\x94\x29\xb4\x2f\xca\xe9\x3c\x17\x12\xf6\x91\xc5\x6d\xf1\x5e\x75\x2c\xfd\x69\xcc\x93\x9d\x3e\xf8\x29\x8a\xb9\x2c\xf8\x09\xb6\xa1\x19\x86\xe3\x4a\x8d\x9b\xcb\x91\x5b\x67\x0d\x7a\xf9\xe3\x31\xce\xb9\xe4\xe6\x4e\x0f\x43\xed\xd2\x57\xf7\xe6\x5f\xf1\x67\x3b\xf6\x68\x06\x4f\xe1\xf5\xee\xd1\x70\x48\x57\x8b\x43\xfc\x25\xe8\x40\x22\x30\xf8\xed\xc5\x1d\x35\xa3\x03\xe0\xef\x52\x86\x11\x66\x44\x07\x13\x79\x6b\xa7\xbc\x34\x13\xef\xe2\x94\x9f\x13\x84\x69\x22\x10\xf1\x46\x8c\xdc\xb9\xc9\x07\x91\x33\x3a\x04\x92\xee\xc4\xb7\x9c\x25\x2c\x62\x72\xd2\x22\xe6\x57\x0a\x3e\x50\xd1\x9d\x80\x28\xd1\x58\x99\x2e\xf9\xf7\x2d\xef\x99\x19\xd4\x66\xce\x0d\x5e\x8c\x53\x8e\x04\xec\x60\xbe\x53\xe8\x06\x97\x88\x3a\xc5\xae\x3f\x4c\xe8\x1b\xee\xa6\xc7\x95\xf6\xe1\x0c\x3e\x4d\x6b\x41\x13\xcc\xd0\x47\xe9\x0d\xb4\x68\x45\xab\xb3\xcb\x1e\x8b\xec\xef\x4e\xb7\x3b\x89\x0c\xff\xdd\x78\x2f\xe3\x5a\x8d\xe3\xc6\xe5\x55\x2a\xf7\x55\x4e\x8f\x8f\xf1\xd9\x45\x4d\x2a\x06\x8c\xf7\x6b\x78\x1b\xfb\xb5\xac\xb7\x67\x0e\x87\xea\x43\x4c\x37\xf7\x3b\xfa\x4f\x71\xd9\x00\x20\xdf\x4e\xcf\xab\xb3\x44\x54\x1e\xea\x01\x1f\x1f\x4b\x5e\xa4\x07\x75\x38\x14\xe0\x51\xad\x76\xc6\x5f\xde\x11\xf2\xc0\xde\x05\xc0\xfa\xe6\x07\x7f\x58\x1c\xc8\x5d\x8d\x09\x23\x41\x57\x1c\x20\x41\xcb\x61\x09\xbf\xdb\xff\x50\x9c\x77\x6f\x82\xdc\xb1\x26\x2d\x48\x25\x13\xa1\xe8\xd6\xf4\xf0\xfd\x85\xbe\x90\x08\x64\x06\x72\x89\x54\xf2\x52\x5c\x99\x7a\xaf\x25\x75\xc4\xc2\xce\xff\x15\x51\x51\x90\x23\x96\x3e\xce\x99\x49\x24\xca\xc9\x92\x3d\x19\xd1\xc8\x28\x93\xc9\x3b\x5c\x0b\x8f\xb4\x1f\x44\x56\x67\xcf\xa7\x0f\x0f\xa6\xe5\x8c\x0c\xdd\xd1\x89\x8d\x22\x01\x58\xb0\xc3\x31\x8a\xe4\x7a\x01\x88\x2f\x4d\xe5\x56\xb5\xd4\x9e\x43\x2c\x65\xa8\xda\x36\xab\xd1\x36\x74\x5a\xe2\xd2\xd2\x09\x22\xe1\x7e\x39\xfd\x56\xab\x06\xcf\xcd\xd3\xcb\xa9\x77\x27\xb8\x59\xc5\x97\xa7\xe7\x57\xb4\x8b\xa0\xb5\xe3\xda\xe5\x65\xed\xfc\xba\xd9\x3e\x91\x6b\xe7\xd7\x27\xa7\xd5\x46\xbd\x51\x3b\x9f\x73\x70\xf8\xbf\xc7\xe9\xe0\xd7\x69\xe9\x3f\xfc\xb4\x54\xa5\x94\x61\x8f\xbb\xb4\x97\x3e\x51\xbd\x44\xb4\x90\x3d\x3f\x40\xae\xee\xd1\x45\xee\x4f\x3e\x13\xff\x77\xf3\x70\x88\x0a\x79\x38\x42\x85\x1d\xd8\x42\x85\x5d\xe8\xa2\xc2\x47\xd8\x46\x85\x3d\xa8\xa1\xc2\x27\xa8\xa0\x62\x1e\xf6\x51\xb1\x00\xeb\xa8\x58\x84\x35\x54\x2c\xc1\x01\x2a\xee\xc2\x5b\x54\xfc\x00\x0f\x50\xf1\x23\x7c\x40\xc5\x3d\xd8\x44\x3b\x79\xd8\x40\x3b\x45\x78\x84\x76\x76\xe0\x25\xda\x29\xc1\x7b\xb4\xb3\x0b\x1f\xd1\xce\x47\xf8\x8c\x76\xf6\xe0\x0d\xda\xf9\x04\x2f\x50\x29\x0f\x8f\x51\xa9\x08\xaf\xa9\x1c\xee\x6f\xd0\x17\xf9\x88\x4a\x23\xe7\x52\x11\x1e\xd7\xa5\x1d\xa8\x9c\x48\x25\xd8\x3c\x96\x76\xe1\xc5\xbe\xf4\x01\x7e\x3b\x94\x3e\xc2\x1f\xdf\xa4\x3d\xb8\x7f\x2c\x7d\x82\x17\x67\xd2\x10\xfe\xf8\x76\x28\x15\x0a\x50\x2e\x4a\x85\x22\x94\xb1\x34\x82\xb2\x2c\x15\x4a\xf0\xe0\x4a\x6a\x41\x45\x96\x0a\x1f\xa0\x72\x2c\xb9\x50\x39\x93\xda\xb0\xf6\x5d\xd2\x60\xa3\x29\x29\xb0\x79\x21\xf5\xe1\xe9\x99\x54\x87\xad\xb6\x54\xdc\x81\x8d\x0b\xa9\x06\x9b\x6d\x69\x00\xcf\x4e\xa5\x5b\x78\x76\x2e\x1d\xc0\x8b\x2b\xe9\x01\xe2\x86\x54\xfc\x04\xf1\xb1\xd4\x84\xca\xa1\xb4\x53\x80\x35\x59\x6a\xc0\xda\x89\x74\x04\x0f\x8a\xd2\x25\x3c\xd8\x91\xee\xe1\xc1\xb1\xb4\xf3\x01\x36\xaa\xd2\x23\x3c\x3c\x96\x9e\xe1\xe1\x57\xe9\x06\x1e\x5e\x4a\x17\xf0\xbc\x21\x95\x0a\xf0\x02\x4b\xc7\xf0\xfb\x77\xa9\xb4\x33\x81\xd3\x04\x4a\xd8\x14\x00\x4c\xa7\x66\xc2\xff\xf9\x7f\x04\x78\x32\x45\xf8\x84\xff\xf3\xff\x0a\xf0\x34\x41\x1d\x99\x07\xb7\x17\x3c\xc5\xd2\x49\xdd\x32\xef\x65\xd5\x26\x1f\x4a\x40\x0c\xae\x98\x03\x78\x8e\x3a\x4d\xb8\xf3\xa1\x0b\xcf\x50\xa7\x00\x8b\x70\x07\xee\x76\xe1\x77\xd4\x19\xc2\xbd\x2e\xfc\x0b\x75\x0e\xe0\x6d\x17\x3e\xa1\x33\xff\xfb\x45\xdf\x01\xfc\x8a\x3a\xcf\xf0\x06\x5e\xc0\x4b\x78\xdf\x85\x77\xa8\xd3\x82\xa3\x2e\x3c\x5c\x44\xbb\xa7\x85\x85\x64\x50\x82\x2f\x85\x4c\x86\xef\xf7\x4d\x14\x89\x4a\x50\xe8\x56\xa2\x0f\x81\xad\x10\x7a\xc4\xc2\xb3\x33\x84\xf7\xec\x52\x3e\x06\x1d\x04\x7f\x3d\xcd\x69\x84\x19\x40\xf5\x81\xa8\x7e\xe9\x55\x44\xcf\x44\x40\x09\xab\xba\x85\x7a\x40\xf2\x5f\x14\x00\xdc\x2a\x6c\x22\xd4\x09\x04\x41\x2e\xdc\x40\x61\x68\x9a\x36\x11\xba\x81\xa3\x3f\xa5\x31\xbc\xe8\x5e\x31\xbf\x07\xf7\x8a\x85\x02\x2c\x14\x77\x0a\x1f\x60\xa1\x58\x2a\xed\x85\x05\x43\xca\xe7\x99\x3b\x64\x00\x3d\xda\x54\xf8\xc0\x86\x54\x42\x08\xa9\xe3\x71\xa1\xc0\x22\x79\x50\x82\x42\x55\x72\x79\x66\xb5\xa6\x1f\xb8\xdc\xe9\xc8\x5b\x81\xeb\x00\xbb\x88\xf0\x14\x74\x6b\x83\x8a\xe8\xd5\xb4\x58\xb1\xa0\xba\x0d\x80\x24\xa6\x34\x1a\x7e\xe1\x3f\xc8\xdb\x61\x43\xaa\x78\x45\xfc\x35\x60\x6a\x6b\x5f\x7a\x04\x92\x8a\x10\x3a\xae\x04\x2d\x48\xc5\x4f\xd1\xf2\x4d\x20\x95\x76\xd8\x0b\xfc\x05\x15\x76\x0a\xf9\x8f\xc5\x4c\x06\x7f\x46\x85\x4f\x1f\x3e\xe4\x77\xc7\x63\xfa\x96\xfe\xdc\x63\x6f\x8b\x1f\x8a\x85\x52\xc1\xaf\xfb\x08\xa4\xb0\x15\x86\x1f\x3e\x3d\x07\x13\x00\x3b\x16\x74\xa0\xd1\x9d\xc0\xe9\xa0\x91\x7c\xcd\x0d\x64\x51\x16\x9c\xc2\xaf\x2a\x6c\xd1\x70\x00\x27\x03\x48\x18\x21\x64\x00\x9f\xd3\xc8\xc8\x29\xcb\x9f\x83\x20\xd8\x65\x1f\x89\xac\x4e\x36\x2b\xb3\x26\xe9\xac\x09\xf0\xaf\x4e\xb1\x37\x9b\x08\x0d\x01\x13\xee\x27\x94\x1f\x20\xfa\xe8\x37\x68\x23\xa7\x6c\x7f\xc9\x97\xfd\x78\x21\x56\x67\x6b\xcb\x5e\x6a\x6c\x26\x1f\x9b\x19\x34\xa5\x23\xa7\xac\x4f\x8d\xad\xc7\xc6\xa6\xb3\x26\x7b\x53\x63\xeb\xc5\xc7\x66\x46\x1e\xbd\x62\x85\x09\xbc\x9a\x19\x55\x0f\x97\x9d\x2f\xc8\x1f\xbc\x27\xd9\xe8\x03\xd1\x62\xcd\xf8\x08\x53\x76\xb6\xb6\x7c\xec\xc9\x4f\xe0\xb7\xd4\x50\x9e\x1e\x5e\xb3\x60\x21\x5e\xd9\xaa\x17\x12\xd4\xda\x2a\x4c\xc3\xc3\x00\x99\x0c\xbb\x99\x66\x74\xe4\x44\x0d\x15\xc9\x5b\x05\x68\x23\x39\x5b\x80\x26\x22\x1d\xb9\x0b\x75\xa4\x7e\x41\xf9\x0a\xe9\xa8\x5d\x29\x0f\x7b\x88\x74\x38\x8c\x8b\x88\x19\x05\x29\x1e\xf6\xc2\x46\xd8\xc5\x9d\x4d\x84\xce\x22\xb0\xf6\x73\xaf\x53\x72\x7b\x60\xba\xee\xf7\x59\xb9\x7b\x08\xa1\x2b\x51\x86\x24\x78\x7d\x42\x5f\xb3\xfd\xed\x91\x22\x3a\xa3\x4c\x86\xad\xd6\xe3\x78\x4c\x93\x06\x4f\x8e\xe2\x4d\x7d\xa4\xa3\x1f\x8f\x3f\x4e\x8d\xfe\x13\xc3\x8b\xf8\x98\x10\xa2\x24\x7c\x04\x5b\xdd\xc8\xac\x32\x99\x4f\xe9\x53\xef\xb8\xb0\x0d\x35\x58\x83\x0f\xdd\x59\x13\xe1\x93\x40\x08\xd5\x63\xaf\xf7\xc5\xe2\x0e\xac\xc3\xe8\x04\xbd\xf7\xb4\xcd\x2e\xec\xa7\x65\x15\x8a\x90\x32\xe7\x64\x86\x89\x22\x78\xc4\xc0\x54\xdc\xe1\x73\x2e\x4e\x2f\x59\xe1\x03\x7d\x35\x1e\xb3\xd4\x8c\xd5\xe2\x53\x1a\xc1\x16\xec\x47\xa7\x33\x1e\x17\x4a\x53\x90\xda\xa1\xd5\x75\x8f\x7c\xdf\xa5\x60\x40\x30\xb2\x87\x4c\x86\x15\x8e\x0f\x83\xae\x93\xe2\x55\x3f\xf7\x79\xa4\x02\x35\x38\x80\x8f\xb0\x01\x8f\xc0\xac\x26\xbd\x1a\xe1\xf0\x32\x19\xda\xcb\x60\x3c\x4e\xe4\xd0\x65\xa3\xbd\x0c\xa6\x46\x74\xe0\x73\x1d\xd6\x53\x7c\xaa\xa9\x19\x7e\x53\xb7\xf3\x46\x62\xfa\xcc\xec\xaf\xe9\x06\xff\x9a\x2e\x75\x3e\x77\x5f\x30\xf1\x21\x56\x89\x41\xcc\x9f\x65\xa7\x1e\x45\x50\x0a\x03\xd2\xb1\xb3\x85\x2e\x9b\x6e\x6a\x99\x00\x1a\xe3\x31\x03\x97\x0f\x82\x01\x7c\x80\xb5\xee\xfc\xb1\xb0\x32\x90\xa2\x65\xb4\x9c\x4f\xde\x9a\x48\x2e\x37\x43\xf2\x76\x8c\x48\xa7\xc9\xa8\xc6\xf1\x14\xf0\xf9\xf6\x8a\x75\x78\x0c\x38\x1d\x2d\x37\xb7\xb6\x26\xe9\xb3\x8f\xf4\xf5\x84\x82\x6d\x17\x9d\x5a\x45\x95\xe4\xf2\x53\x38\x86\x43\x44\x3a\x4f\x6c\x0c\x87\xcb\x8c\xe1\xd0\x1f\xc3\x13\x1f\xc3\x33\x27\x77\xbc\x2b\x2a\xb1\x51\x79\x2d\x05\x4b\x6e\xe0\x65\x77\x7a\x61\x3b\x37\xf0\x22\xad\xf4\x45\xb4\x11\x7f\x39\x2e\xa6\xc1\xfd\x35\xa5\x49\x25\x0e\x0f\xaf\xc9\xaf\x53\xbb\xe0\x60\x29\x04\x9d\x89\x7a\xb4\x89\xda\x52\xf8\x19\x6c\xd9\x01\x98\x9a\x53\x3d\xd8\x8a\xd3\x65\xfc\x81\xb6\x63\x4d\x96\x0a\x1c\xe2\x2c\xed\x85\x9c\xf3\x1b\x95\xce\xba\xf0\x0f\x54\x28\x7f\xfb\x92\xf7\xf2\x49\x67\x6b\xeb\x5b\xb7\x0c\xfe\xc8\x66\x69\xdd\x3f\xfe\x55\xdc\x44\xf9\xa0\x39\x9f\x83\xd2\x4e\x1a\x7c\x3c\x47\x95\xaa\x74\x32\x81\x7f\x50\x05\x69\xca\x6e\x32\xa5\x9b\xe7\x23\xcc\x9f\x8f\x8e\x7c\x41\xfe\x61\x55\xc8\xde\x38\x63\x3f\x14\x31\x80\x16\x92\xb9\x33\xaa\xc1\x9d\x51\xd5\x98\x33\xea\x37\x76\x23\xd9\x60\xd7\xe3\xe2\x9d\x91\xf1\x58\x24\x28\x12\x5d\x37\x90\x97\xc3\xa0\xba\xfe\xab\x09\x08\x7b\x84\x91\x69\xf8\xbd\xef\x24\x7a\x67\x1e\xb1\x45\x7f\x10\x11\x93\x29\xfb\x1a\x4a\xd0\x7e\x26\x13\x8d\xc1\x1b\xcf\x1b\x8f\x45\x15\xa9\x33\xae\xcf\xfb\x84\xa1\x09\x8f\xa3\x52\x7a\xe5\x51\xc2\x13\x00\x60\xc7\x80\x2a\x0c\xad\xb0\x28\xd6\x70\x25\xe9\x20\x1c\xb9\x64\x41\x32\x19\xdc\x71\xba\x54\xa8\xfd\xf4\x61\x8f\x3f\x7c\x46\xa5\xfc\xa7\xdd\x4f\x13\x1e\xdc\xa5\x3b\x01\xf0\x4f\xba\x94\x33\xad\x63\x69\xc6\x11\x16\x0d\x23\xf9\xad\x17\x68\xa1\x2a\x34\xd0\x1f\xa2\xc3\xaf\x0a\xc8\xa2\x41\x01\x69\x23\x95\x02\xd2\x44\x2a\x05\x64\x0f\xa9\x21\x20\x37\x9c\x34\x1d\x89\x80\x17\x2b\xcb\xbb\x98\xfa\x44\x4c\x96\xa2\x8f\x6f\x32\xd9\x2a\x54\xae\xa5\x6f\xa2\x03\x4d\x68\x43\x92\x2d\xc0\x1e\xa0\x92\xb8\x35\x81\xff\x9c\xab\x22\xd7\xa1\x2e\xea\x5f\x09\xb1\xbc\x88\xe6\xc8\x41\x08\x5d\xc7\xbe\x51\xbd\xe0\x36\xc8\x50\xef\xcd\xb9\x1b\x91\x00\x97\xf7\x3d\x61\xae\xc8\x26\x4f\xd0\xa6\x4c\x66\x91\x38\x7d\x79\xe8\xf8\x1f\x3d\x0e\x3e\x22\x43\xc2\x03\x66\x92\xcd\x02\xa7\x43\xba\x08\x77\x48\xb8\x90\x41\xa8\x3d\xd6\x30\x1d\x88\x88\x3d\x58\x44\x61\xe0\x85\x94\x4e\x5e\x58\x21\x46\x9f\x7d\x7f\xd8\xbb\xa0\x01\xca\x71\xdb\xed\x2a\x28\xe8\xa1\x9f\x81\x64\xd1\xe2\xb1\x57\x0c\xee\xd2\x6e\x50\xf4\x33\x91\xd1\x29\x52\x2c\xf4\x71\x08\x0e\x51\x1e\x8e\x50\xde\x3f\x26\x30\xc8\x93\x93\xf8\xa2\xf4\xe8\x4b\x20\x6c\xbd\xf4\x4d\x83\x59\x97\xcb\xe1\x27\xa3\xab\xe5\xd1\xe7\x5e\x26\x23\x62\x44\x51\xd1\x86\x2a\xcc\x66\x47\xd0\x04\x54\x48\xad\x96\x99\x36\x8d\x37\x11\xaa\x8e\xc7\x23\x4e\x8e\xc3\x93\xca\x3f\x45\x07\x62\x38\x84\xa3\x30\xe0\x02\x1a\xf9\x36\x6c\x02\x79\x67\x05\xdf\x82\x17\x74\x3e\x79\x0f\x2f\x0f\xcf\x92\x9d\x66\xa8\x41\x24\xd7\xbe\x3c\x6f\xd4\x8a\xd7\x8d\x66\xb5\xf6\xfd\xba\x78\x7d\x82\x2f\x8e\xa6\xdf\x32\x17\xd0\xeb\xe3\x5a\x73\xff\xf2\x20\xcc\x3d\x3d\x69\x5c\x5e\xd6\xaa\xd7\xf2\xc9\x99\x57\xb2\x30\x55\xc6\x7f\x7f\x5a\xaf\x5f\xd4\x2e\xc3\xf7\xed\xcb\xfa\xde\x75\x51\x0e\x7a\x48\xd6\x4b\xe6\x27\xeb\x07\x23\x3b\x39\x9b\xaa\x7b\x7c\xa1\x9c\xcd\x6c\xb8\x8a\x2f\x71\x62\x96\xec\x55\xfa\x14\x63\x4d\x25\xc7\x70\x71\xd0\xa8\x5f\x5e\x17\xae\x8b\xc9\x61\xb1\x8c\xa9\x72\xc9\x17\xc5\x5f\x51\xd1\x23\xc6\x62\x79\x1a\x3c\xbb\xec\x5b\x0f\x09\x20\x16\xa8\x2a\x9e\x0a\xef\x22\xd5\xce\xa7\xd7\x46\xdd\x92\xa1\x3e\x7f\x45\xd9\xb5\x8d\x2f\x5f\x64\xaa\xc9\xcf\x46\x8a\xc2\xe7\xcf\x32\x1c\xa6\x61\x52\x6f\xab\x00\x47\xf3\xf1\xaf\x90\x2f\x96\x68\x0f\xad\xb9\x28\xac\x67\x47\xd0\x5d\xb8\x09\x5a\xb0\xbd\x70\x23\xed\x14\x59\xe4\x95\xf4\x5d\xe8\x66\xdb\x50\x59\x6a\x1f\x7b\x90\x51\x61\x7f\x01\x51\x28\x7c\xfe\x6c\xc2\xfa\x0c\x7a\xd2\xdf\x2a\xc0\x1a\x33\xbb\xa7\xd1\xa0\x69\xb3\x2d\x0b\x9d\xd5\x27\x94\xb9\x00\xfe\x7d\xfe\x38\x57\x23\xa0\xc2\x3f\xf6\x65\x0e\x9f\xdb\xba\xe1\xec\x14\xd9\x7b\x20\x12\x7e\x0d\x31\xf2\x4e\x64\x97\xa0\xe6\x57\x2f\x7c\x98\xae\xee\xbd\x13\xd9\xd5\x49\xcb\x63\x6e\x85\x22\xf3\xc5\xd8\x66\x5f\x53\x2e\x32\xf3\xd2\x6e\xb7\xe2\xe7\x8a\xc5\x52\x96\x66\x83\xed\x22\x90\x1c\xef\x65\x18\x99\x29\xcc\x2e\x45\xbe\xbb\x40\xdc\x8d\x9a\x98\xe6\xf4\x21\x43\x95\x7d\x21\x94\x51\xef\xb9\x52\x0f\x2b\xfa\x77\x4a\x3e\xde\xd7\x91\x98\x33\xa7\x2f\xfa\xb0\x90\xc9\xfc\x8d\xc7\xf9\x6f\x75\xed\xf6\x22\x2a\xfc\xd0\x17\xac\x04\x57\x28\x0c\xbf\x31\xfa\xe0\x5d\x19\x65\x1f\x23\x50\x53\x3e\x3d\xa0\x11\x67\x76\xb0\x73\x8f\x8c\x52\x76\xfc\x05\xe5\xb9\x14\xf4\x79\x77\xb7\xf8\xe9\xc3\x78\x8c\xbf\xec\x7e\xd8\x29\x7c\x62\x46\x5f\x8a\xcc\xbb\xbe\x66\x42\x90\x28\x7a\xdf\x2a\x60\x43\xe8\xe0\x2f\x5f\xe4\x2e\xf8\xfc\xd9\x06\x59\x11\x67\x86\x20\x1c\x11\x95\x86\x58\x9b\x0b\x5a\xd0\xb3\x22\xde\x62\xfd\x7e\xf9\x22\x83\x05\x6d\xc5\x61\x14\xb6\xa9\x6d\x29\x59\x11\x7f\xf9\xa2\x02\x18\x6b\x9c\x74\x21\xc9\x22\x3a\xc8\x4c\x1d\x4e\x75\x4d\x16\x8d\xbc\x50\x28\x94\x0a\x85\x02\x88\x86\x4d\x60\x25\x52\x96\x26\xf0\x10\x4a\xac\x6c\x28\xc5\x2d\x10\x52\xc2\xc0\xb6\xc2\x91\x8b\x83\x7f\x0a\x2e\xe1\x46\xd5\xc4\xf8\x0c\x0f\xd8\x23\xff\xd7\xc0\x32\xc6\xfb\xf4\x4f\x4d\xc3\x6d\x2c\x5f\xe1\x7a\x09\xff\xd0\x64\x82\xf7\xaf\xf0\x15\x96\x4d\x7c\x80\x31\xc1\xfc\x79\x80\x95\x1a\x6e\x60\xac\x63\xa5\x85\x0f\x35\x6c\x62\xc5\xc4\x47\x79\xec\xb4\x94\x4f\xf8\xa4\x8d\xbf\x6b\xf2\x7d\xb4\xfe\x5f\xad\xea\x57\xfe\x5c\x3d\xc7\xcd\x3b\xbc\xa3\x55\xef\xf1\xa9\x8b\x3f\xe1\xea\x1e\xc6\x2d\xb9\x8a\x6b\x6d\x7c\x6e\xca\x0d\x6d\x1f\xe3\x86\x86\x0f\xdd\xda\x23\xbe\xec\xc9\x67\x6e\xbd\x8e\xdb\x79\xf9\x12\xd7\xdb\xf8\xab\x2b\xff\xc0\x75\x1b\x7f\x3f\x91\x89\xbb\x4f\xe9\x3e\xd6\xdd\xfd\x4b\xfc\xc3\x96\x4d\x6d\xff\x0e\xab\xae\xec\xe0\xfd\x3d\xdc\x6b\xc8\xcf\xda\xc1\x05\xee\x9b\x72\x09\x1f\x98\x78\x80\xe5\x2c\x3e\xc8\xe2\xd6\x95\x52\xd5\x1a\xdf\xf0\x63\x49\x3e\xd0\x1a\xf7\x58\x2f\x29\x4d\xad\x91\xc5\x77\x6d\xe5\xb2\x75\x78\x89\x87\xb6\x72\xe5\x1e\x5a\xd8\xa8\x29\xa4\x75\x24\xe3\xbb\xbc\xa2\xb7\x8e\xce\xf1\xc3\x9d\x62\xb6\x8e\x4c\x6c\x61\x65\x84\x8f\x31\xb6\x5b\xca\x5f\xb8\xe1\xe2\x66\x4b\xd9\xc1\xc7\x77\xf8\x0f\x8c\x3f\xe2\xe3\x3c\x7e\x74\x15\xdc\x3a\x39\xc4\x4f\xb8\xba\x8f\x4f\x5c\xac\xe0\xea\xa1\x76\x32\xc2\x7f\x5d\x55\xcf\xb4\x53\x8c\x6b\x57\xd5\x0b\xad\x79\x81\x0b\x8d\x6a\x5b\x6b\xaa\xb8\x60\x56\xaf\x70\x53\xc7\xc5\x46\x55\xa3\xcb\xb0\x6f\x56\x35\x2c\x3f\xe3\x9d\xab\xea\x80\x96\x6f\xb4\xe8\xfb\x23\xbc\xdb\xa8\xde\xb3\x67\x8c\x4d\xed\xf4\x4f\x5c\xc2\x98\x95\x6f\x2c\x99\x1e\xed\x55\x1d\x97\xd7\x7f\x74\xcf\x0e\xf0\xde\x5e\xb5\xe0\x9e\x0d\xf0\x33\xae\xee\xba\x67\x36\xde\x6e\x55\xb7\x31\xcf\x97\x71\xeb\x44\x96\x1b\x35\x0d\xe3\x6f\xb2\x5c\xaa\x1d\x6a\xad\x91\x5c\x3d\xa9\x35\xf0\xc9\x47\xb9\x56\xab\x7d\xd7\xe4\x43\x59\xc1\xd5\x76\xeb\xfc\x87\xbc\x5f\xab\xa9\xad\x96\x8b\xab\x18\xf7\x5a\xad\x2c\xfe\x7e\x57\xd3\x5a\x17\x87\xf2\x61\xad\xa6\x61\xe5\x4a\xa6\xe3\xc5\x17\xa6\x7c\xb4\x57\x73\xdc\x96\x8b\x8f\xf7\x6a\x4f\xad\x8b\xe4\xf8\x34\x7c\x92\xa7\xed\x12\x8a\x1f\xb1\xb4\xd9\xae\x7d\xd7\xaa\x3f\xe4\x53\xda\x6f\xf5\x41\x3e\xab\xd5\xb2\xad\x96\x2c\xb7\xee\xea\xb5\x56\xfb\x87\x7c\x51\xab\x1f\xb5\xda\x4f\xf2\x65\xbb\x7e\xd6\xfa\x5a\x97\xdb\x6e\xfd\x2b\xfe\xda\x93\xbf\x96\xf0\x95\xfb\x95\xe0\x7d\xbb\xde\x73\xbf\x7e\x94\xaf\x4e\xea\xba\xfb\xed\x82\xbe\xbf\xd7\xbe\x69\xb2\xda\xab\xc7\xfa\x39\xb2\xeb\xdf\x35\xe5\x59\xbe\xa9\xd5\x47\xda\xb7\x8f\x72\xaf\x51\x77\xb5\xef\x0d\x2f\x6d\xc9\xfd\x56\x7d\x07\x7f\xbf\x93\x89\x5d\xdf\x73\xbf\x7f\x94\x5b\x27\xfb\x8a\x7b\x75\x29\xdf\xda\xfb\x0d\xf7\xca\x92\xff\x38\xd9\x3f\x75\x7f\x10\x5c\xdd\xdb\x3f\x77\x7f\x34\xe5\x61\x09\x7f\xc5\x3f\x6e\x68\x9a\x3a\x2f\x3f\xdd\x3f\xd9\xff\xae\xc9\x7f\xca\x46\x6d\x7f\x4e\xb9\x5d\xd9\xc4\xfb\x25\xf7\x62\x5f\x36\x4b\xfb\x77\xae\x4a\xe1\x56\x3d\xd0\xce\x77\x83\x72\x87\xf6\xbe\x86\xe5\x7d\x8a\x17\xa6\xab\x5a\xb2\x75\xb2\x6f\xbb\xaa\x86\x8f\xed\x7d\xd7\xbd\x39\x96\xff\xc0\x38\xef\xde\xa8\xb2\x63\xee\xef\xb4\x78\x5a\xd4\x82\x74\x28\x8f\xec\xfd\x3d\xf7\xe6\xa3\xac\x9d\x1c\x28\x6e\xef\x52\x7e\xb2\x69\xfa\x87\xfc\x6c\x1f\x9c\xe0\x5e\x41\xfe\xab\x7d\x70\xaa\xf5\x15\xf9\x93\xb9\x7f\xa1\xf5\x2f\xe4\x82\x79\x70\x85\x07\xaa\x3c\x34\x0f\x54\x96\x36\x0e\x22\xed\x85\xe9\x1f\xed\x83\x66\x8b\xd7\xff\x95\xfe\x4a\xd3\xd2\x9b\x56\x9f\xe1\xf9\x2f\x78\xfc\x4a\x7f\xa5\xbf\xd2\x5f\xe9\xaf\xf4\xff\x8e\xb4\x5f\x90\x77\xf2\xef\xdb\x4f\xe9\xe4\xa0\xa8\xa9\x47\xf2\x87\xbd\x5a\xba\xfc\xbf\x77\x30\x74\xfb\x04\x1f\xee\x1d\x3c\xb8\x84\xbd\xb7\x5c\xb2\x23\x17\xa8\xdc\xa8\x6c\xcb\x7b\xed\x83\x67\xad\xe7\xe2\x26\x3e\x28\xe2\x81\x26\x97\x30\xfe\x80\x07\xae\xfc\x57\x49\xce\xe2\x1e\x56\xea\xae\xac\x60\xed\x4c\x91\x7b\x0d\x53\xab\x5d\xe1\xf3\xbd\xc6\xa1\xab\x63\xac\xec\x35\x9a\xae\xb6\xad\x28\xb8\x7a\xee\xde\x9e\x29\xf5\x5e\xe3\xbb\x7b\x6b\x28\x35\xb3\xba\xaf\xf9\xf2\xbd\xfc\xa8\x1c\xf4\x1a\x04\xdf\xee\x2a\x07\x66\x83\xb8\xb7\x7b\xca\x41\xbe\xd1\x77\x6f\x4b\xca\xc1\x5d\x83\x68\xb7\x1f\x95\x03\xb7\x31\x68\xdd\xee\x28\x07\x5a\x83\xb4\x6e\x3f\x28\x07\x76\x63\x80\x6f\x3f\xfd\xaa\xf7\xab\xde\xaf\x7a\x7f\x4f\xbd\x5b\xac\x1f\x2b\x8d\x52\xe3\x04\x63\xa6\xc7\xaf\x35\x3d\xbc\x6a\x0c\x35\xfd\x9b\xb2\xd6\x54\x5b\xff\x38\x7f\xa5\xff\xf5\xe9\x5c\x3e\xb9\x5b\x6a\xb0\xf4\x43\xa3\x51\xd4\xd4\x3f\x95\xe3\x46\x63\xa4\xe9\xdc\x1e\xa6\xfd\xb1\xaf\xcc\xb1\x9f\x3d\xbb\xfa\x01\xbe\xc2\x38\x4f\xf9\x5e\xf3\xae\xb1\xd3\xfa\x63\xa8\x9c\xe6\x1b\x9f\xf0\x1f\x7b\x41\x3d\xdc\x38\x54\xb4\xbb\x0b\xe5\xdc\x3c\x6c\x68\x77\x86\x72\x79\x75\x70\xec\xde\xed\x28\x3f\xde\x03\xff\xf9\xb8\x31\xae\x63\xcf\x88\x84\x71\x0f\xcb\x04\x1f\xb8\xb8\x85\x95\x16\x3e\xc2\xd8\x6a\x29\x9f\xf0\xa1\x67\x1c\xaa\xe5\xf1\x8e\x26\x9f\xe3\x66\x09\x7f\xc4\xd5\x3d\x7c\xe2\xca\xfb\x5a\x0d\xe3\xa3\x9e\xdc\x74\x6b\x75\xdc\x76\xe5\xef\xb8\x5e\x6a\xdd\xdd\x2a\xf7\xb5\x23\x03\x5b\x3d\x45\xc3\x07\x07\xd8\xc6\xf2\x5f\xa5\x63\xd6\xb8\x8b\x0f\x30\xee\x67\x95\x0f\x58\x36\xf1\x7e\x56\xd9\x8e\xbe\xef\x65\xab\xf5\xd2\x09\x7b\xde\x2d\x9d\xec\x68\x2e\xa9\x7e\x2d\x35\x0d\x6d\x87\x54\x55\x56\x5e\xc3\x2b\xa5\x35\x52\xfd\x13\xcb\x5f\xb5\x0f\xdf\x68\x6a\xb6\x3e\x78\xef\x0f\xbe\x57\x1f\x7b\xa7\x4d\x77\x7b\x87\xa6\x9f\xdc\x8f\xeb\x4b\x8d\xde\x59\x64\x3e\xbf\xd2\x5f\xe9\xaf\x74\x1d\xe9\xc7\xde\xd9\x99\x3b\xdc\x57\xda\xa5\xc3\x93\x80\xae\xca\xdf\x94\xaf\xa5\xc3\xab\xd6\x3d\xc6\xfb\x77\x87\x3d\x3c\x2c\x29\xdf\xdd\x43\x0d\xdf\x85\xf4\xbc\xa1\x1d\x6a\x58\x39\x56\x7e\x9c\xd0\xf4\x87\xf2\x63\xef\xd0\x74\xef\x2d\xe5\x0a\x63\xdb\xbd\x73\x3d\xbb\xf7\x1e\x6d\x6f\xe4\xde\x61\xf9\xe4\xe4\xf0\x99\xb6\x77\x52\x3a\xd4\x70\xf5\xab\x72\x19\xf2\x85\x59\x74\xfd\x4f\xf7\xea\x9b\xdc\xbc\x8b\xc8\x3d\xd5\xbe\x42\xf0\xe1\x07\x6c\x8c\x94\xf3\x52\xed\x93\x76\xe7\xe2\xb3\xd2\xa1\xdc\x32\x9b\xca\x1f\x34\x5f\xc1\x58\x6e\x1f\x31\x3e\x20\xe7\x8f\x0e\xb1\x69\x2b\x7f\xb4\x8e\x34\x56\xdf\x3d\x6a\xb9\x7f\x62\x5c\xb3\x8f\x1e\x5b\xf7\x7d\xe5\xeb\xc9\xd1\x37\xd7\x0c\xfb\x3f\xee\xd5\x58\xfd\xfd\x93\x23\x0d\xcb\x16\x6f\x6f\x26\x3f\x23\xf2\x22\x7e\xd7\xb8\xab\x9d\xb5\xea\x7f\x29\x86\x79\xa4\xb7\x2e\x14\xc5\x34\x8f\xee\xf0\x9f\x87\xf2\xa1\x76\x64\xe2\x3f\xef\x14\xf3\xae\xb6\x8f\xf7\x6d\xc5\x6a\x1d\x3d\x62\x4b\xe6\xfd\x55\x0f\x15\xa7\x76\x54\x6f\x1d\xfc\x50\x46\xb5\xa3\x6d\xed\xe0\x41\x79\xac\x1d\x85\xed\x52\xb8\xb8\xb5\x6c\xcb\x74\x29\x7c\xce\xdc\x9a\xac\xfc\x15\xed\x97\xf2\xb9\xbb\xe3\x5a\xcb\xf6\xf3\x7f\x28\xcf\xb5\x63\x0d\xe3\x53\x45\xb9\x3b\x3e\xc1\xf8\x49\xf9\x8b\xa5\xb1\xf1\x72\x16\x54\x3b\x4e\x9d\x47\xed\xee\xf8\xb2\xe5\x7c\x55\x4a\x18\x7f\xc7\xce\x1d\x4d\xf5\xd6\x5d\xea\xbc\x6f\xb0\xf3\xa4\xec\xdc\x1d\x6b\x78\x54\x57\x4a\x36\x6f\xef\xf0\xe4\x78\xe8\x8e\x06\xf1\x71\xae\x90\x36\x56\x3c\x47\x9b\x93\x3e\xb8\x76\x04\x8e\xec\xfd\xa3\x92\x3c\xa7\x3b\xee\x1d\xbf\x56\xbe\x59\x75\x3c\x8f\xee\x08\xe3\x93\xde\xf1\x94\x3c\xa3\x8d\x62\xcf\xf9\x96\xfd\x2e\xf2\xd8\x52\xe3\x6c\xde\x05\xe3\x2b\x61\x7b\xdd\xeb\x75\x48\xf7\xf1\x07\xaf\xdd\x5b\xf7\xc0\xa5\xeb\x91\xc5\x36\xae\x62\xed\xa4\x86\xdd\x35\xcd\x97\xf7\xb7\x8f\xdd\x7e\x55\x69\x9f\xb0\xf7\x4a\xfe\xe4\xbf\xc7\x4e\xe5\xbe\xa9\xfe\x59\xcb\xfd\x1b\xe5\xfc\xd4\x71\x14\x65\xbe\xff\x77\xab\xd5\xb9\xf6\xb8\x7a\xf5\x6f\xd4\x47\x7c\x3c\xbc\x6c\x3d\x5d\x54\xeb\xe6\xc9\x5a\xda\x4d\x39\x1f\xbe\xd2\x9e\x08\xde\x37\x4f\xbe\x6b\xf2\x53\xf5\xe0\xee\x64\xe0\x3e\x11\xdc\x68\x9f\xb0\xfc\x46\xfe\x64\xba\xbe\xf2\xb5\x7a\x18\x7d\xcf\xdb\x79\x68\x3d\x11\x7c\x64\x9f\xd8\xee\xf3\xc7\x6a\xbd\x84\x5d\xed\xf9\x53\xf5\xc4\x3c\x99\x7d\x2e\x5d\x3d\xaf\x36\xef\x4e\x48\x4b\xfe\x53\x21\xf8\x64\x07\x3f\xed\xe1\xd3\xab\x93\x8f\xf8\xaf\x7c\xf5\x4c\x3b\x99\x7b\xee\x1d\x4b\x15\x0d\x63\xdc\x34\x31\x3e\xa8\xb6\x4a\xcd\xba\x96\xff\xbb\xf5\x47\x52\xbd\xb8\x6a\xfe\x57\xe8\xb9\x49\x3a\xa7\x94\x9a\xfe\xfa\x35\xff\x16\xb8\x95\x9a\xe7\x5a\xe1\xb4\xfa\xf5\xaa\xf9\x5d\x2b\xdc\x57\x2f\x31\xbe\x69\xa5\xf7\x9b\xea\x0f\x60\xb4\x9b\x44\xdb\x51\xe4\x2b\xdc\x74\xb5\x6f\xf5\x6a\xdf\xdc\xff\x03\xef\x4c\x97\x8b\xa5\x6a\xbb\xfa\xc3\x6d\x3e\xe0\xa2\x49\xcb\x17\x35\xd5\xad\xde\xf4\x9a\x8f\xee\xce\x01\x7f\xbe\x39\xab\xf6\xaf\x9a\x3b\x78\x67\x50\x25\x57\xcd\xa2\x76\x63\x57\x07\x27\x4d\x56\xff\xd1\x6c\x6e\x6b\x3b\xaa\xac\x5d\x9d\x56\xb5\x8f\x6a\xe0\x8f\x21\x5f\x9d\xb2\x54\x69\xef\x17\xb5\x2b\x52\x1d\x96\xf0\x21\xde\x25\x58\x71\x4f\x8b\x2e\x1f\xcf\x49\xab\xb4\x5b\x8d\x8c\xa3\xd5\xfa\xb8\x60\x9c\xef\x9d\xfe\x38\xac\xfe\xd3\xfc\x29\x0a\xb5\xd3\xa2\x76\xf5\x4f\x3d\x7f\xf9\x31\x05\xaf\x62\xed\xf4\xbf\x85\x2f\xab\xb8\xb4\xfe\x76\x77\xf0\xe9\x7f\x0e\x7f\x57\x4d\x57\xc0\xab\x62\xed\xf4\x3f\xba\x2f\xff\x2b\xe0\x79\xa3\xca\x77\x77\xa7\x04\x7f\xd0\xf0\x11\xc6\x66\x94\x5e\xb3\x67\x45\x8b\xa6\x1a\x2e\xfd\x87\xf9\x5d\x75\x7b\xdb\x6d\x31\x6f\x54\x8c\x93\x69\x9e\x96\xe2\x3f\xb5\xb4\xfc\xb9\xe9\x11\x96\x4f\x70\xdd\xc5\x04\xcb\x36\xde\xd7\x68\xda\xc3\x75\x0d\x5f\x60\xb9\x84\xf7\x5d\x7c\x85\xf1\x1e\xb7\xaa\xd6\x6c\x7c\xe1\xca\xc7\x69\xe9\x3e\xc6\x57\xb4\xfc\x01\xab\x7f\x82\x0f\x34\xb9\x85\xeb\x18\xb7\xf1\xdb\xd2\xba\x86\x6f\xb0\xdc\xf0\xda\x2d\xbd\xb9\x3d\x96\xca\x57\xb8\xda\xc2\xe7\xb4\x3d\x19\xff\x17\xfd\x53\x6c\x7c\xe4\x62\xeb\xbf\x21\x8d\xe3\x59\x7b\x15\x7c\x9c\x93\xde\x51\x7c\x50\x19\x9e\xba\x14\x2f\x4a\xf8\xa0\x85\xfb\x34\xbd\x74\xf1\x77\x9a\x56\x5b\x1c\x4f\xf6\x29\xde\xd4\xf6\xe8\xfb\x53\xba\xee\xbc\x5c\x1e\x5f\xba\xf2\x19\xc5\x6f\x96\xd6\xf6\x70\xfd\x8d\x78\x7a\xe0\xf5\xe7\xe3\xe7\x7a\xd2\xfc\x9a\xdb\xfb\x3b\x52\xba\xaf\x4a\x29\xfb\xf4\xbf\x60\xdc\x6b\xa0\x53\x7f\x5f\x1a\x19\x7f\x1d\x53\x3c\xc6\x1c\xcf\x29\x3e\xb3\xe7\x96\xf7\xbe\x95\x8a\x57\xde\x3e\x38\xd0\xf8\xbe\xa9\x26\xe6\x3f\x6b\x5d\x57\x5d\xc7\xf5\xec\xf7\xbf\x35\x3d\x5c\x86\xfe\x28\x2d\x5a\x2e\x4c\x97\x68\x37\xb6\x5e\x3e\x7c\x18\x9d\x8c\xc0\x7d\x9f\xa6\x11\xfa\x19\x96\x0f\xd6\x9d\x95\x3f\x72\x5f\x87\xe7\xaf\xad\xf7\x8a\x75\xfe\xa7\xed\x73\x6b\x4d\xfb\x8e\xad\x4b\xca\x3e\xb0\xde\x63\x9f\x1f\x31\xb9\x2b\xcf\xf1\x81\xf7\x73\x33\xcd\x57\xff\xbe\xb4\xda\xc2\xb5\x60\xbd\x83\xf4\x84\xa6\xa9\xfc\xff\xab\x26\x7f\xc3\xf5\xab\x37\xa7\xb1\x76\xfd\xf7\x3e\xdc\xe7\xc8\x1f\xb3\xf0\x21\x38\x5d\x0f\xe5\xd5\xb9\xf3\xae\xb9\xb8\x46\xdb\xab\xb9\xf8\xf2\x9d\xe9\xfa\x2b\xd7\x27\x5d\x1e\x67\x29\x9d\x67\x0b\xff\x08\xf8\x31\x6e\xbd\x51\x6e\x3e\x49\x1f\x67\x2a\x1c\x79\xbd\x18\xbe\x44\xde\xcf\xd2\x23\x2e\xdc\x38\x9f\x5b\x96\xef\x30\xfa\xc6\xfa\xfb\x07\xac\x0b\xc3\xc3\x7f\x96\xdc\x30\x77\xbc\x9c\xde\x2c\x96\xeb\xe7\xe8\x7f\x7f\xf7\xb8\x39\x3e\xb2\xf5\xbf\xf2\xf0\x32\x36\xde\xb5\xac\x77\xb2\xff\xc8\x73\x12\x2f\x22\x74\x7a\x31\xbe\x2a\xf6\x3a\xf1\xd2\xa7\x77\xd6\x32\xfc\x6b\x75\x7d\xee\x0d\xfc\x72\xad\xe3\xc0\xd6\x92\xfb\x8f\xac\x97\xff\xbd\x17\x3d\xe1\xf4\x78\xa5\xf1\xa4\xee\x87\x39\xfd\xf1\x72\x4d\x2a\x47\xcc\xa6\xb7\x9c\x6e\xae\xba\x1f\x67\xe1\x45\x28\xd7\xae\xb0\x0f\x53\xcb\x05\xf2\x6e\xa2\x1d\xdf\xbe\x90\x0e\xbf\x08\x9e\xc4\xec\x10\xb3\xf0\x2e\x26\xbf\x24\xf1\x36\xd2\xce\x22\x7e\xc5\xe4\x8a\xf8\xbc\x4e\xb8\xfd\x8c\xd3\xa9\xa4\x5d\x64\x1a\x7e\x29\xe3\x58\x03\xfc\x52\x53\x7f\xde\x71\xf8\x25\xf7\x59\x62\xbc\x29\xf0\x8a\x8d\xd7\x5f\xff\xb8\x1e\xe3\xa7\x73\xf0\xaf\x16\x95\x4b\x64\xbc\x9c\x5d\x69\x36\x5d\x8a\x8c\x67\xad\xf0\x5b\x0e\xff\x62\x70\x4d\xc2\x6f\x59\x3e\xeb\x8f\x67\x29\xfc\xe3\x76\xdb\x54\xba\x9d\x22\x97\xac\x7f\xff\x2e\xb7\xff\xe6\xd0\xf3\x37\xee\xbf\x74\xfa\x35\x07\xbe\xb5\x00\x4f\x53\xf7\x5f\x3a\xff\x8a\xad\x0b\xd7\x03\xad\xb4\x7a\x49\x7a\xb5\xac\x3c\x12\x1b\x5f\x12\x9e\x71\x38\x4e\xcb\x99\x29\x70\x9d\xc3\xcf\x67\xeb\x0b\x81\x9c\x9f\x94\x5b\xec\x29\x7d\x2b\x86\xef\xeb\xda\x87\xa9\xeb\x32\x7f\xdf\xfa\x78\xb3\xec\x3e\x4c\xa5\x2f\xc9\x79\xa4\xc8\x3f\x11\x78\xcf\x86\xdf\xb2\xf2\x13\xd7\x6b\xfe\x7e\xf8\x25\xdb\x89\xec\x87\xb5\xc0\x2f\x85\x2f\xac\x0a\xbf\x69\xf8\xcf\xa1\x8f\xeb\xd2\x2f\x56\x9a\x7f\x9c\x9f\x47\xe8\x45\x6d\x61\x3f\xcb\xee\xbf\x29\x7c\x31\xd3\xe9\xc5\x5c\xfc\x59\x6e\xdf\xac\x4f\xae\x8f\xd0\xc5\x59\xfc\xd4\xc7\xb7\x99\xe7\x44\xad\x20\x7f\xb6\x5e\xbd\x9c\x3e\x1a\x81\x0f\x59\x88\x4f\x75\x76\x78\xd4\x5b\x6f\x8a\xff\x0c\x52\xc5\xc4\x47\x5a\x34\x0d\xfb\xdf\x77\x53\xea\x4f\x95\x67\x29\x99\x37\xdf\x6a\x0b\x37\x13\x74\x87\xb5\xc7\xd2\x59\xcf\x73\xe0\x70\x94\x3a\x2e\x3b\x9e\xcf\x9e\x79\xfd\x64\xfe\x9c\xf9\x5b\x3c\x8d\x8f\x2b\xd9\xee\xd4\xfc\x97\x59\xef\x48\x3b\x6d\x8c\x4f\x31\x2e\xe1\xaa\x86\x4f\xf9\x39\x07\x7d\xbe\xf3\xd2\x3c\x56\x5a\xf8\x92\x8a\xe8\xcc\xae\x27\x9f\xd0\x67\xef\xdc\x3a\x62\xd7\x4e\xf2\xc1\x57\xd9\x3f\xa8\xfe\xd5\xe2\xf6\x31\xde\xee\x37\x2c\xd7\x70\x5d\xc3\xe7\xf3\xf4\xb7\xb7\xdb\x8f\x56\xd6\x9b\x9b\xe9\xcf\x2b\xd8\x91\xde\xcb\x3e\xad\x78\xf8\x9d\x5c\x0f\x0e\xd7\xd4\x73\x0e\x7f\x9d\xab\x89\x7c\x76\x6e\x93\xb2\x4f\xd6\xbf\xff\x3d\x7c\xd6\xd2\xf6\xff\x82\xb4\xee\xce\x93\x77\x99\x3e\x1f\x39\x9f\x9b\xa6\x3b\x91\x76\x92\xe3\x08\xf3\x67\x8d\x6f\x7e\x3b\xaf\x9d\x27\x6b\x6f\xde\xfe\x4d\x94\x4f\xdd\x0f\x49\xb9\x6a\xad\x76\xd6\xb8\x1e\xf1\x8d\xc5\x7b\xd3\xd6\x9c\xde\xe1\x6f\x2d\xf9\xc7\x9a\x53\x15\xd7\x4d\xfc\x4d\x5b\x6f\xba\x94\x7c\x39\x0b\xfe\x31\xfd\x28\xa9\x57\x2e\x92\x4b\x5f\x21\xdf\x2d\x55\x3f\x2e\x8f\xce\x1d\xff\xaa\x72\xcf\x12\xe5\x5f\x2f\x6f\xcd\x94\xdf\x22\xf6\xce\xfc\xda\xfc\x1a\x56\x97\xaf\xe7\xdb\xb9\x67\xd9\x89\x5e\x35\xae\x74\x38\x34\xdf\xd3\xcf\x62\xa5\x7a\x38\xbf\x36\xff\xb4\x5a\x6b\x39\xfb\x3b\xe3\x8b\x8b\xfa\x7d\x95\xfe\x14\x87\xf7\x5c\x3b\xce\x6b\xd7\x37\xe2\xbf\x58\x6d\xad\xeb\xfc\x61\x89\x71\xae\x3a\x7f\x5f\xae\x79\x17\x3d\xe2\x15\xf2\x81\x62\x7a\xf2\x50\x9b\xd6\x6f\x7a\x7e\x6f\x37\x1e\x1f\x5e\x64\x2f\x5b\x1e\xbe\xc9\xf9\xf1\x7d\xcd\xe4\x65\x8e\x77\xe1\x73\xe4\xfc\xf7\x70\x6d\xfd\xaf\x2a\xe7\xce\x5a\xdf\x35\x9e\xe3\xc8\x33\xec\x43\x6f\xa0\xe3\xef\x6a\xdf\x88\xc1\x69\xa9\x73\xeb\x74\xbd\x3c\xf5\x9c\x85\x97\x0f\xe9\x3c\xd3\xa7\xe6\xd9\x37\x56\xdc\x1f\xa9\xfa\xe1\x1b\xf6\x5f\xa4\xfc\xca\x72\xfc\xd2\xe7\x19\xd1\x7e\x98\x3c\xbd\xbe\xf3\x6f\x1f\xde\x72\xe9\x3d\xf4\x11\xeb\x35\x74\x68\x7e\x7b\xf6\x7c\xff\x94\x55\xed\x39\xd1\xf2\x69\x7a\x4b\xba\x9d\x65\x59\x3d\xd3\x7a\x9f\x73\xdf\x14\xbf\x85\x59\xf4\x6b\x91\x7d\x87\xd3\xf9\xa6\xc7\x2f\x67\xcb\x5d\xb3\xe6\xb9\x48\x4e\x8b\x9c\x33\xaf\x95\xfe\x2c\x01\x7f\x56\x6e\x55\xfb\xca\xb2\xeb\x3a\xd7\x3f\x6c\xe5\xf6\x66\xb5\xef\xaf\xcb\xa2\xf3\xf6\x24\xdf\x58\xdd\x1e\xfc\x36\x7c\x9c\x2b\x2f\xbe\xc9\xef\x7f\x96\xff\xe5\x9c\x73\xdc\x03\x6d\x39\xbf\x87\x18\xff\x4d\xae\x57\x8a\x3f\xcc\xac\xf3\xb4\xd7\xa6\xc9\x76\xde\xe4\x8f\x9a\xc2\xdf\x67\xcb\xcf\x11\xbd\xd5\xd7\xab\xdf\xc1\x4f\x76\x25\xff\xa5\x14\xfa\x91\xfa\x3e\xe2\xef\x1c\x99\xe7\xec\x76\x92\xf0\x58\xb6\x9f\x15\xe0\x9d\xda\x3f\xf6\xca\x45\xf6\xaf\x9f\x2a\xe1\x73\x83\xae\xbb\xe2\x06\xfe\xb0\x87\xde\xfb\x13\xcf\xaf\x9e\x78\x2c\xf6\x5b\xc8\x72\xaf\x68\xda\x0f\xef\x73\xf8\x4b\x9a\xf7\x50\x29\xe1\x7f\x9e\x1e\x05\xca\x6f\xb7\x4f\xe5\xfd\xfa\x34\xdd\xbf\xf2\xf4\xc5\xaf\x33\xf2\x93\xe9\x34\x1f\x09\xe6\xdb\x8b\xc3\x6d\x11\xbd\xe6\x74\xec\x6c\x86\x3d\x80\xd9\xb9\xd9\x3d\x84\xe0\x7e\xc2\xde\xd4\x39\x28\xef\xcf\xd3\x77\x57\xb0\x4f\xf0\xfb\x3f\xb1\x54\x4d\x3c\xcf\x4a\xe3\xe5\xb4\x44\xea\x2e\x97\xae\xee\x0f\xba\x2c\xfd\xe4\xe7\x7d\xfe\xfd\x0c\x0e\x4f\x73\xe6\x7a\x5e\x7a\xfe\x0f\xfb\x6e\x8a\xbd\x22\x7e\xef\x23\xbc\x4f\xe0\xb7\x5b\x0f\xef\x8b\x2c\xb2\x1f\xad\x7a\x0f\x28\x32\x8e\xe9\x75\xf7\x9f\x79\x7a\x16\xc5\x8f\x94\x34\x56\x6f\x56\xb9\x99\xf7\xb3\x12\x74\xe5\xd2\x8d\xd0\x3b\x0e\xf7\x7e\xec\x5e\x4c\x2c\x7d\x15\x3d\xec\x7b\xf7\xd2\xe6\x97\x6b\x45\xd6\x25\xa8\x97\x9f\xbe\xff\xe5\x95\x8b\xdc\x77\x4b\xb9\x27\x16\xbb\xd7\x43\xa2\xf7\x7b\xa6\xe6\xa5\x4d\xcd\x2b\x7d\xbe\x8b\xe6\xdf\x4a\xcc\x57\x9b\xf9\x3c\xab\x7e\x7f\x46\xff\xfd\xc4\xbc\x5e\x01\xff\x55\xeb\xe7\xd3\xe6\xb5\xee\xfb\x78\x2b\xe0\xd3\x4a\xf2\x45\x78\x9e\xb8\xdc\xb8\x87\x58\x69\xcf\x6c\x2f\xbd\x9d\x65\xe5\x80\x36\x3e\x6c\xcd\x6f\x3f\x55\xee\x78\xd3\x7d\xd3\x85\xf4\xe3\x55\x69\x3a\x3d\x58\x47\xfa\xea\x71\xb5\x16\xb7\x9f\xdc\x5f\xaf\x18\xdf\xa2\x7d\xb2\x52\x3b\x4b\xb5\x1b\xa1\x4b\x4b\xd1\xdf\x39\xfb\x3b\xf5\xb9\x9f\xd8\x7f\xaf\xa3\xef\xe1\xb8\xd6\xb0\xbf\x4b\xc1\x3e\x39\x4c\xf2\x81\x79\xf3\xe1\xe5\xd9\x38\x58\xbd\x60\xbf\x61\x9e\xae\x41\x0f\x48\xd9\xbf\xcb\xf1\xb3\x55\xd3\x56\x82\x3f\xd1\x7e\x68\xbf\xb1\xf7\x2b\xf5\x3b\x7c\x97\x7b\xd8\x6b\x9e\x77\x64\xdd\x53\xd3\x08\x9e\x0d\x63\xeb\x91\xc8\xe7\xeb\xed\x97\xcb\x07\xf9\x01\x3e\x25\xf6\xcb\xe1\xf4\x3e\x4d\xf6\xcb\xd2\x06\x9e\x6a\x6f\x98\x46\xd7\x7d\xbc\xf3\x43\x2f\xad\x97\x3f\x26\x4d\x97\x25\xee\xa7\x13\xe9\x9f\xf3\x29\xa6\x37\x44\xf8\x5f\xe2\xf9\x2d\xf4\x7f\x49\xbe\xbb\x2e\xbc\x98\x33\x9f\x57\xb4\xb7\x00\x2e\x73\x9e\xdf\x61\x3e\x6b\xdc\x3f\x6b\x68\xef\xed\xf2\xfd\xdb\xed\x25\x73\xe4\xa0\x37\xdc\xe3\x5e\xc9\x3e\xb7\x82\x9c\xb5\xec\x3c\x62\xf7\xbf\xe3\xfd\x9e\x44\xce\xa9\xf1\xe5\x4c\xfb\x63\xea\x39\x58\xd2\xaf\x71\xbe\x5f\xff\xba\xcf\x11\x67\xfb\xb7\x2c\xe7\x1f\x32\xab\xfe\x72\x47\xc3\xd3\xf6\x28\xdf\x5e\x53\xd7\x02\x7f\x38\x56\x3e\x42\x37\x53\xf7\x75\xa4\xfe\x65\xe0\x37\xe0\xdb\x81\xe2\xeb\xc8\x43\x0e\xb5\x02\x3f\xb3\x66\xd0\x5f\x72\x3c\x6f\x90\xdb\x17\xf1\xc1\xe5\xd2\x75\xb5\x33\x9d\xbe\xe3\xf8\x57\x85\xd7\xf2\xed\xe1\x3c\x5d\xef\x73\xfe\x5e\x3e\xc0\xf5\x1e\xfe\xea\xce\xa1\xfb\xbc\x7e\x7a\xbe\x97\xd6\x68\x3f\xac\x1d\xf9\xfb\x54\x3a\x65\xe7\x6a\x47\xf2\x71\xd1\x1b\x87\x5f\xfe\x00\xd7\x7a\x11\xf8\xca\xe7\xf4\x7d\x9b\xe5\xd7\x68\x7e\xe4\x79\x46\x7f\x4b\xa7\xb5\x37\xd6\x4f\x4d\x93\xe3\x8d\xe5\xa7\x8c\xfb\x9c\x96\x8b\x9c\xab\x31\xfb\xec\xb9\xcb\xd7\xa5\xde\x7a\xf7\xf9\x9f\xcf\x1e\xd7\x74\xf9\x58\x39\xb9\x4d\x9f\xd9\x7a\x7d\x4d\xc6\x75\x58\x33\x5c\xf9\xb9\x47\xef\x3d\xd6\x2b\x91\xd2\xf1\xc7\xf0\xf1\xfb\xbc\x7d\xb5\xd6\xf9\x05\xf0\x5b\x9e\xbe\xb4\x5b\x1c\x7f\x16\xa7\xef\x41\xff\xe6\xad\xf3\x1b\xda\x4d\x95\xb7\xe7\xd0\x97\x64\xba\x52\x7f\x6b\x58\xbf\xd7\xe2\xc7\x6b\xe1\xf3\xda\x71\xd6\x56\xc7\xc7\xf5\xf1\xad\xd5\xe4\x2c\x26\x7f\xac\xe6\x27\xb9\xe0\x7c\xfc\x75\xf2\xc7\x52\x72\x79\xdc\xff\x66\x6e\x5c\x81\x64\xfc\xb3\xb7\xa6\xaf\xf2\x5b\x8b\xf8\x03\x47\xe4\xb4\xd7\xcf\x7f\x89\x73\xda\xf4\xf3\xa6\x65\xe6\xf7\xba\xb8\x72\xc9\x73\xe5\x95\xce\x81\x5f\xab\x37\xbd\xd6\x4f\x2f\x76\xaf\x3d\xfd\xfd\x1a\xfc\x69\x52\xfd\xad\x53\xcf\xc1\xf8\x39\xe2\x5a\xfc\x2f\xf9\xbd\x2a\x76\x7f\x6a\xb6\x7f\xc7\x7b\xfb\x11\xa5\xaf\xcb\x92\xfe\x37\xaf\xf5\x0f\x99\xe5\xff\x4e\xc7\x57\x9a\x79\xff\x60\x56\xdc\xd6\x6a\xeb\x7d\xfc\xa9\x16\xd9\x01\xd6\x7a\xaf\x25\xe2\x3f\x96\xdc\x5f\x11\x3d\x32\x16\x2f\x6d\xa9\xf5\x49\xb9\xdf\x74\xa4\xcd\x51\x9a\xe7\xf8\x8f\x25\xfd\x40\x5f\x15\x27\x69\xd1\x79\xfe\xa2\xfd\xbd\x5c\x3c\x03\x9f\x3e\x7b\xf4\x7b\x3d\xf7\xcf\x92\xf7\xbe\x56\xbd\xc7\x1a\xb6\xe3\xfb\x59\xa6\xf4\xe3\xaf\xcf\x5b\xe3\xc7\xc6\xee\xc1\xae\x12\x1f\x2a\xba\x9f\x16\xed\x83\x59\xf1\xfd\x96\xbe\x77\xb2\xd4\xfd\x87\xe5\xed\x47\xaf\x8b\x43\xc6\xe2\xf2\xf9\xf3\x5c\xc1\x7f\xf6\x2b\x96\xbf\xe2\x7a\x1b\x7f\x6d\xbd\x39\x6d\xaf\xa9\x9d\xaf\x8b\xf1\x62\xf5\xfb\x71\x91\xf5\x5e\xeb\xfd\xb8\xc8\xb8\x78\x28\x41\x6d\xbd\xe9\xf2\xfa\xc9\x7a\xf4\xd4\xa4\xbc\xbf\x7a\xdc\xae\x39\x7e\xa4\xf5\x2b\xca\x37\x67\xc7\x79\x94\x4b\x4b\xc4\x83\x8c\xc4\x7f\x8c\x3c\x1f\xb9\x7e\x9c\xc8\x78\x9a\xde\xce\xaa\xf7\xb0\x4a\xef\xe3\xc7\xf0\x0e\x7e\xbd\xcc\x6e\xf7\xd6\xfb\x74\xeb\x8e\xd7\xb6\x94\x7c\x89\xd5\x00\x7e\x2b\xc8\x61\xfb\x18\x9f\x63\xb9\xe6\x6d\x1a\x26\x87\x72\xbb\xe5\x5b\xfc\x7f\xe3\xfa\xee\xa2\xf3\x32\x56\x2e\x62\x47\x8d\xed\x1f\x96\x2f\x33\xfb\x1f\xb3\xfb\xf9\xe7\x97\xc9\xf6\xe6\xd8\xb5\x6f\xa8\xbc\x1e\xd3\xbb\xdf\x74\x1f\x75\x05\xbc\xc0\xcc\x4e\x70\xe9\x8d\xc7\x1f\xc7\x30\x3a\x6f\x7f\x7e\x73\xe9\x0f\xf7\x47\xf5\xe7\x75\xb9\x36\xbb\x9a\x7c\x45\xdb\x3b\x7f\xb3\xdd\x24\x6e\xd7\xfa\x16\xce\xeb\x8a\xdb\xd1\x83\xb4\x1d\xd8\x73\xd3\xed\x70\xef\x64\xb7\xac\xf5\xf0\xf9\x0c\xbb\x6b\xaa\xdd\x94\xef\xb7\x14\xbb\xa7\x3d\x65\xff\x61\xfe\xae\x3e\xfc\xb8\x5f\xab\xb5\x22\x5d\xab\x85\x4e\xcc\xf9\xe5\xe8\xc9\xdb\xe2\x72\x5a\xaf\xc3\xe7\x55\xe3\x69\xac\x16\x77\x6f\x8d\xf1\x07\x62\xf0\xf5\xf5\xa6\xf5\xdd\x93\x8c\xc8\xad\xab\xda\x75\x56\xf9\x1e\xc2\x92\xf1\xf6\x57\x88\x4b\x1e\xd3\x07\xdf\xe1\x7b\x15\xeb\x8e\x87\xbe\xfe\xfb\x9b\x2b\xc4\x47\x5d\x2b\x1f\x58\xeb\xbd\xd4\x77\x88\xcf\x9b\xd4\xef\xd6\xcd\x0f\xd9\x3e\x4c\x5f\x87\xa5\xee\xff\xff\x8d\xf7\x7b\xdf\x14\xcf\xeb\x1d\xe0\xf7\x56\xb9\x77\x91\xfd\xea\xf5\xf2\x67\xe0\x57\x62\xad\x03\x3f\x92\xf1\xd4\xde\x0e\x47\x7e\x8e\xff\xb6\xf8\x11\x33\xe2\x7f\xac\x80\x87\xef\x1a\x1f\x3a\x35\xce\xdf\x3b\xec\x87\xe4\xfe\x5d\x17\x3e\xaf\xe1\x3b\x54\xb3\xe6\x9d\xbc\x6f\x38\x2b\xfe\xf5\x5b\xe3\x44\x2e\xe2\x33\x29\xf4\xb5\xb6\x8a\x7e\x98\xe2\xb7\xd4\x4c\xdf\xb7\xef\x10\x37\x7e\xd6\xfa\xac\x61\xdd\x92\xf6\xdf\x24\xfd\x8f\xcf\xb7\xf5\x9e\x7c\x74\x1a\xbe\x6b\x90\x2b\x96\x3f\x17\x7b\x83\x9c\xf2\x3a\xfb\xe7\xbb\xd8\x55\x96\xe0\x17\x33\xce\x6d\x66\xe9\x49\x2b\xf4\xbf\x4a\xbc\x83\x99\xe7\x6c\x6b\x3b\x37\x0a\xef\x87\xae\xe4\xdf\xf7\x66\x78\x2f\x1f\x1f\xe2\x0d\xe7\x35\x8b\xe2\xe9\x2d\x35\xdf\xd7\xd1\x0b\x12\x3d\x17\x5c\xe4\xb7\x1a\xf1\xcb\x24\xd1\xb8\x0d\x8b\xbf\xbf\xc1\xbf\x73\x17\xea\x8d\xeb\x95\xfb\x5f\x35\xff\x57\xc4\x0f\x4f\x8f\x4b\x19\xfa\xa1\x32\x3f\xe3\x15\xe2\xbb\xad\x25\x6e\x72\x4c\x0f\x5f\x39\x3e\xda\xf2\xe7\xb4\x2b\xd0\x83\xa5\xe2\x6f\xc7\xe4\xac\x95\xe9\x83\x95\x88\x7b\x15\x7b\xdf\x4e\xb3\xb3\xce\xa1\x0b\x29\xed\x4c\x9f\xa7\x2e\x11\xb7\x63\x76\x7c\xa2\x74\x3e\x7c\xa0\xcd\xa7\x2f\xcc\x3f\x26\xc5\xfe\x1c\x89\xd3\x6d\xad\xf8\x3d\x83\x57\xd2\xc7\x99\x70\x99\x85\x3f\xa7\x81\x3f\x77\x24\x6e\x6d\xaa\xdc\x95\x92\xa6\xc6\x4b\xe3\xe7\x89\xcd\x79\xf3\x5e\x7d\xfe\x91\x38\xbc\xb3\xd2\x57\xd8\x6d\x56\xe8\x7f\xf5\x73\xe7\xb7\xc5\x7d\xf6\xdb\x5b\x29\x4e\xd2\xa2\xfd\xcf\xda\x0f\xf8\x94\xb9\xc4\xf7\xb3\x5e\x77\x7e\xf7\x7e\xdf\xc1\x59\xf8\x3d\x9b\xd3\x04\xfe\x9e\x46\xed\x69\x29\xf7\x42\x16\xc7\x13\x4a\xb5\xe7\xae\xe2\xef\x13\xca\x05\x01\xbe\xbe\xf1\xde\xc3\xf2\xf2\xd3\x7a\xec\x31\x2b\xc5\x69\x8e\xc8\x0f\x8b\xe6\xb9\x3a\xfe\xcd\xc4\xc7\x53\xfe\xfd\xae\xd7\x9c\x53\xbd\x26\xae\xd7\x6a\x71\xa2\xe6\xfa\x6f\xac\xd1\x8e\x29\x27\xe2\xe3\xcf\x5e\x27\xce\xa7\x57\xfd\x3e\xdb\xbb\xd8\x1f\x5f\x2b\x1f\x26\xed\x03\xcb\xee\x8f\x35\xee\xbb\xb7\xce\xff\x02\xcb\x0d\x5c\xd3\x70\xcb\x95\xab\xb8\x16\xc3\xdf\x6a\xa8\xdf\xb1\xfc\x46\x22\xff\xad\xfd\x56\x57\x69\xef\x1d\xfc\x12\x5e\x39\x9f\x35\xac\xdb\x72\xf8\xdd\x4c\x93\xd7\xdf\xaa\xbf\xa6\xd0\x9b\xe6\x7a\xf0\x6b\x0e\xdf\x99\x73\x3e\xc7\xf4\xc3\xd7\xca\x47\x6b\xfd\xde\xc0\xdf\x60\xd7\x99\xe5\xff\x30\x17\xfe\xef\xf8\x3d\xdc\x57\x7d\x07\x7f\x19\x7b\x50\x78\xde\xbf\x46\xf9\x62\x09\x3f\xb2\xd5\xdb\x7d\xdd\xfd\xab\x45\xeb\xdb\x7b\x87\x7b\x57\x2b\xd0\xc7\xb5\xd8\x0b\xa7\xf8\x15\x49\xfb\xbe\xc6\x3f\xe2\xfc\x7a\xb5\xfb\x31\x6f\xbf\x37\x92\xfc\x5e\xf8\xa2\x78\xa5\x4b\xa4\xb3\xea\xbf\x61\x9c\x8b\xe3\xa5\xbe\x57\x3c\xa3\xe4\x3d\xfa\x7f\x80\x7f\xc3\xba\xe4\xa7\x37\xc4\x0f\x7d\x7d\xfc\xc9\xb5\x7c\x37\x3e\x6e\xef\x4a\xb5\xa7\x2d\x15\xb7\x61\x4e\xdc\x80\x77\xfc\xde\xfd\xa2\xb8\xa2\x29\xeb\x34\x1d\x47\x30\x66\xef\x4b\xa7\x73\x6f\x8d\x7f\xfa\xd6\xef\xb5\xbc\x9f\xbf\xd2\x2b\xee\xc1\x2d\xfa\x2e\xc6\x5a\xda\x7f\xdb\xfc\x16\xc9\xd3\x6f\x4d\xdf\x24\x5f\xcd\xe2\x17\xab\xc5\xb5\xae\x2d\xe0\x43\x64\x2a\x0e\xea\xeb\xbe\x43\x6d\xbd\xaf\xdc\xf8\x8a\x7e\x52\xbe\xbf\x9a\xd2\xce\x4a\xf6\xf6\x95\xfc\xfe\x57\x38\x7f\x5c\x42\xfe\x58\x00\xc7\xe5\xce\x0f\xd9\x55\xb5\xb5\x7e\x5f\x2d\xfd\x3b\xc1\xc9\xef\x5e\x2e\xf5\xbd\xa2\x59\xdf\x4d\x4e\xfa\x89\x44\xfc\x96\xa6\xbf\x53\x9b\xd2\x7f\xb2\x7c\xf2\xfb\xb5\x29\xe3\x58\xf4\xbd\xa7\xb9\xe7\x6d\x6f\xf5\xf7\x4d\xc5\xab\xb7\xfa\xbd\xaf\x2c\x7f\x2d\x55\x7e\x71\x1c\xb1\xc0\xef\x7d\xd5\x38\x8c\x24\x11\x07\x6e\xf9\x78\x8b\xe9\x71\xe4\x16\xa7\xaf\x8e\x13\x71\x87\x8f\x5a\xf8\xe1\x8d\x69\xac\x5d\x16\x7f\xee\xb5\xe3\x89\xc4\x37\x7d\x6d\xfc\x8b\x24\x1c\xe3\x71\x16\x59\xaa\x79\x71\xef\x62\xe3\xf5\xe3\xe0\xad\x3b\x0e\x51\xa3\x85\x6f\xb1\x52\xf3\xd2\xb0\xff\x64\xfc\xbd\x94\x74\xb5\x7e\x52\xeb\xe1\xe8\x7c\x67\xb5\xaf\xa5\xb5\x93\x84\xd3\x1b\xe0\x40\xbc\x75\x19\x4e\xc7\x4f\xc4\x69\xe5\xc8\xd2\xeb\x9c\x12\x17\x77\x05\x3c\x7b\x55\x7c\xc7\xc3\xd6\xeb\xe2\xe9\xae\x8c\x37\x78\x6a\x5d\x56\xad\x1f\x83\xf3\x1b\xd6\xf1\xb5\x70\x5a\x0c\xf7\x39\x78\x9c\x82\xd7\xda\x9b\xe2\x19\xfa\x47\xbc\x5e\x9c\xfd\x14\xbc\xd1\x5e\xb3\xdf\x96\x83\xff\xea\xf9\xab\xe2\xed\xdc\xb8\xaa\x6f\xc3\xe7\x57\xf5\xff\xd6\x7d\xb7\xc2\x7e\x5a\xe3\x7e\x4c\xd2\xc7\xd4\x7d\xa3\x2d\x59\x3f\x96\xce\xda\xd7\xcb\xa5\x73\xf9\xc4\xbb\xf0\x2d\xff\x1e\xe3\xd1\x9a\xef\x25\xbf\x35\x3e\xd7\xbb\xc4\x5f\x7a\x53\x1c\xa8\x35\x8e\xff\xb5\xf1\x08\xd7\x6b\x8f\xb6\x56\xfc\x0e\xf4\xab\xda\x17\x26\x70\x30\x32\x7a\x8e\x6e\x1a\x22\x86\x04\x3a\xe0\x45\x18\xd9\x64\xc3\x76\x2c\xbd\xe7\x08\xe5\xd3\x9b\x3f\x48\xcf\xc9\xf5\xc9\x40\x37\xc8\x99\x65\x3e\x10\xcb\x79\x16\x09\x14\xae\xaf\x89\x7d\x62\xf6\x47\x43\x22\xc0\x97\x47\x75\x38\x22\xd2\x66\x7e\x02\xca\x8f\xaa\xb5\x61\x21\x47\xfc\x00\xca\x84\x56\x53\x47\x43\x07\xf9\x5d\x6c\x60\x91\x40\x07\x1a\xe0\x65\x33\xda\x2b\x78\xd1\x07\xe2\xa6\x88\x37\x74\xc3\x76\x54\xa3\x47\xcc\xc1\x06\x01\xc0\xb9\xb5\x4c\x77\xc3\x20\xee\xc6\xe5\xf3\x03\xa9\x59\x96\x69\x89\x82\xa2\x1a\x86\xe9\x6c\xf4\xd4\xe1\x70\x43\xdd\xe8\x0d\x55\xdb\xde\x50\xed\x0d\x75\xc3\x6f\x50\x00\x13\xd1\xb9\xd5\x6d\x88\x01\xa4\x69\xce\x79\x7e\x20\xc8\xca\x9d\xe1\xcb\x83\x9c\xd2\x38\x57\x8e\x6b\xfc\xfd\x13\x22\xfc\xc7\x33\x72\xf8\x0f\x4b\xed\xeb\x23\x1b\x19\x93\x77\x01\x0a\x34\x02\x38\x88\xe0\xc5\x22\xce\xc8\x32\x36\xa6\xc0\x80\x2d\x4b\x7d\xce\xe9\x36\x4b\x45\x0c\x80\x57\x10\x97\xf5\x81\x78\xf1\x7c\x7f\x63\x0e\x73\xba\x43\x2c\xd5\x31\xad\x0d\xdd\xd8\xe0\x63\x89\x14\x8c\xb7\x48\x7b\x76\x50\xa7\x0b\x2d\xb4\x99\x87\x06\xda\x2c\x40\x19\x3d\x9a\x7a\x7f\x23\x5f\x76\xac\xe7\x97\x81\x69\x89\xb4\x8c\x0a\x6d\x84\x3b\x89\xf6\xbb\x22\x28\x6f\x8a\x16\x12\x55\x64\xe7\x0c\xf2\xe4\x88\x00\xe4\xfa\xa6\x41\x40\x26\x23\x3a\xb9\x87\x91\x7d\x2b\xaa\x39\x36\x4f\x00\x37\xc9\x78\xec\xe4\x86\xc4\xd0\x9c\xdb\x4d\x84\x08\x28\xd3\x2e\x41\x79\xd2\x53\x9d\xde\xad\x88\xc1\x8b\x41\x87\x20\x23\x3c\x19\xe8\x86\x3a\x1c\x3e\xbf\xd0\x01\x6c\x5a\x99\x8c\x9d\xe3\x63\x0f\x7f\x89\x20\x28\xa4\x0f\x44\xc3\x43\x05\x79\x32\xf1\x26\xe9\x4c\xd8\xf4\xca\xa9\x28\xd2\x30\x1e\xd5\xa1\xde\xdf\x50\x1d\x87\xdc\x3f\x38\x1b\x8e\xb9\xd1\x27\xb6\x63\x8d\x7a\xce\xc8\x22\x1b\x86\x69\x6c\xb1\x19\xde\x0c\x49\x80\x71\x02\x98\x4c\x44\x00\xe5\xe8\x12\x45\xb0\x96\xc1\xd2\x87\x95\x83\xf2\x65\xe7\x33\xf1\xe6\x5a\x76\xb2\x59\x0e\x67\x0b\x91\x8e\xd3\x2d\x5b\x39\x62\x8c\xee\x79\xfb\x28\xfa\x30\x1e\x6f\x16\xa0\x95\xeb\x99\xc6\x40\xd7\x46\x3c\x7f\x33\x0f\x05\x06\x40\x41\x37\x36\xac\x4c\x46\xb4\x72\xae\xa5\x3b\x5e\x1e\x80\xe9\xa8\x86\xa1\x95\xbb\x23\xcf\xd0\x02\x01\x44\x82\x71\xd3\x0d\x66\x05\xf8\xe5\x64\x32\x58\x24\xb9\x07\xcb\x74\x4c\xba\x11\xa0\x03\xa0\xc5\xde\x41\x0b\x40\xc2\x26\xad\x22\x47\x2c\x02\x68\x23\xd1\x11\x8b\xbb\x00\x3a\xe2\x6e\x11\x00\x68\x22\x47\xfc\x04\xa0\x8e\x44\x0b\x99\x20\x93\xb1\x72\x21\x7a\x57\x2c\xe9\xc5\xdb\xdc\x92\x35\x81\x3d\xe4\x88\xbb\x00\x0e\x91\x23\x16\x8a\x1c\xdd\x47\x33\x20\xc9\x76\xd3\xdf\xb9\xfb\x55\x4b\x23\x8e\xbf\xd5\xcd\x07\x5a\xc8\x46\x0e\x24\x39\x8b\x18\x7d\x62\x89\x0e\xf0\x41\x28\x8b\x18\x76\x5e\xee\xc8\xb3\x24\xf0\xbc\xa6\xd9\x27\x02\xe4\xfb\x38\x1c\x31\x78\xc1\x39\xdd\xfe\xaa\xdb\xfa\xcd\x90\x88\x6c\x2b\x30\xe2\x11\x54\x91\xd5\xde\x9d\x66\x99\x23\xa3\x8f\x8d\xbe\x6c\x5a\x7d\x62\xd9\xa2\x3f\x9e\xb0\x98\x62\x1a\x0e\x31\xd8\xd6\x9d\x4c\x60\xb2\x5f\x2f\x37\xad\x7b\x0a\x5e\x82\xd8\x2c\x9d\x28\x94\x29\xf5\xc8\xf5\x6e\xf5\x61\x9f\x36\x60\x7b\xf8\x99\xc9\xc4\x5e\x0e\x4c\xab\xa6\xf6\x6e\xc5\xa0\x9e\xc3\x2a\x3a\x51\xe8\xeb\x3e\xe1\xf6\xf1\xda\xc9\x3d\xa8\x16\x31\x9c\x9c\xed\x3c\x0f\x49\x99\x78\x50\xf5\x26\x73\x49\x9e\x1c\xda\xb8\xe8\xe4\x6e\xe8\xac\x6d\x86\xe4\x43\xd3\x82\x56\x6e\x60\x1a\x0e\xb4\x72\x0e\x79\x72\xaa\xa4\x67\x5a\x2a\xed\xd3\x7b\x71\x71\xab\xf6\x4d\x17\x4c\xc8\xd0\x26\x1b\x41\x9b\x7d\x4b\x75\x2f\x6e\xd5\x07\x22\x3a\x10\xf3\x0e\x79\x6b\x60\x02\x20\xce\xe9\xf7\xaa\x16\xd0\x35\xe2\x2f\x28\x7f\x7d\xe1\x98\x16\xc9\x69\xc4\x11\xfd\x72\x94\x68\x06\xb3\x10\xf3\x50\xcd\xf5\xd4\x61\x6f\x34\x54\x1d\x1f\xc0\xb2\xf9\x04\x44\xec\x0f\xdc\xef\xf0\x41\xed\xf7\x75\x43\x0b\x9e\x6f\xd8\x2a\x02\x68\x20\xc1\x18\xdd\xdf\x10\x4b\x40\x88\x6e\x27\x73\xb0\xe1\xe4\x5c\xbd\x4f\xc1\xec\xfd\xf8\x92\xaf\x78\xbf\x24\x8b\xa7\x50\x4e\xab\x75\x4b\x74\xed\xd6\xa1\xd5\xf8\x2f\x56\x8f\xff\x94\x2c\xef\x47\xd9\xf8\x92\xcf\x64\x64\xfa\x27\x80\x4f\x6f\xa8\x3f\x88\x9d\xf8\x5c\xce\xf8\x70\x65\xf3\xe9\x4c\x75\x6e\xe9\x7c\x7a\x23\xeb\x91\xf4\x65\x36\x2b\xd0\x85\x11\x2c\x89\x01\xba\x41\xa1\x24\x3a\x90\x6e\x33\x35\xc7\x8b\x8b\x79\x98\x87\x06\x94\x01\x25\x2f\x60\x32\x99\x40\x0b\x61\x0a\x55\x65\xa8\x3f\xd0\xf6\x6d\x11\x94\x2d\x0f\xbb\x2a\x91\x4d\xc6\x87\x66\x41\x07\x48\x8e\x98\x86\xd3\x69\x1b\x63\x21\x82\x6f\x06\x6b\x10\xd4\x8e\xfc\x54\x28\x66\xe4\x74\xfb\xd2\x52\x0d\x9b\x23\xa9\x08\xc6\xe3\xb9\x75\xd8\xa4\xbd\xf1\xb3\xb9\x45\xd7\x38\x67\x9b\xf7\x44\x8c\x8e\xc6\x67\xc0\x5e\x81\x0b\x5a\x78\x13\xa1\x61\x4e\x3e\x3d\xaf\xd6\xce\xaf\x2f\x2e\xaf\x8e\x6b\xb9\xe6\x69\xb3\x96\xc9\x6c\xfa\xa5\x52\xc7\x35\x01\x71\x19\x20\x40\xcb\x5e\xb8\x94\x01\x8c\xb4\x33\x55\x37\x1c\xdd\xd0\xb0\x45\xd4\xe4\x92\xc2\xf9\x40\x19\xea\x0f\xa0\xec\x4c\x21\x8d\x15\x43\x84\xd7\xc0\x35\x68\x70\xa0\x0f\x87\xe2\xe2\x16\x40\x40\x67\xe5\x38\xf8\x45\xcc\xb7\x73\x0c\xf4\xd3\xb4\x89\x72\x32\x27\x0a\x78\x94\x0a\x78\x2a\x79\xcc\x81\x3b\x1d\xb7\x37\x0a\x56\x88\xb6\x0b\x13\x7b\x64\x02\x26\x8c\x58\x8c\xc7\x16\x5f\x18\x19\x61\x8f\xea\x55\xfc\x1f\x89\x4d\x20\x75\xba\x65\x79\xe6\x3e\x90\xa1\x01\x24\x2a\xc8\x24\x36\x42\x02\x10\xf3\xf1\xbf\xbc\x04\x22\xdb\x43\xbd\x47\xc4\x3c\xc8\x59\xe4\x91\x58\x36\x11\x41\x2a\x91\x17\x46\xd6\x50\x40\x08\x39\x39\xdb\x1c\x59\x3d\x92\xbb\x27\xce\xad\xd9\xa7\x04\xc8\x7b\xa1\x5a\x9a\xcf\x34\x2a\xd3\xcb\x76\x4e\x1e\x88\xea\x88\x98\x6e\xef\x6d\x8d\x8a\xca\xc4\x70\xb6\xf5\x9c\x43\x6c\x47\x4c\x34\x0a\x28\xea\x25\x1b\xd8\xf7\xea\xb0\x26\x26\x60\x26\x58\x78\x47\xd3\x70\x09\xc5\xd9\x28\x2b\x4f\x52\x7e\x12\x9d\x4d\x27\xdf\x9d\x62\x01\xe9\x7b\xcd\xb4\x75\xda\x5c\x64\xbb\xcd\x81\xfb\xa9\xa5\x6b\xba\x01\x57\xe0\x1a\x33\xfa\xed\x5f\xe8\x7f\x11\xe0\x89\x6c\x50\x9e\x59\xcc\x1f\x1e\xa0\xa2\x9c\xf7\x1b\x1a\xb4\x8e\x3a\xb3\x0e\x07\x23\xe7\x07\x04\xca\xb4\x78\x30\x62\x2a\xec\x9d\xa8\xce\x6d\x8e\x95\x14\x29\x31\x1f\x38\x59\x39\xf7\x44\xa5\xbe\x58\x86\x63\x3e\x64\xe5\xdc\x33\x95\xb4\x43\xfc\xe6\x2b\xe6\x21\x84\x4a\x15\x3a\x68\x43\x73\x0e\xa6\xfb\x4b\x3f\x6f\x51\xff\x33\x4b\x93\x44\x09\x7f\xa4\x29\x4b\x34\x6f\x1d\x53\x17\x88\x72\x42\x28\xa3\x18\x6f\x8d\x00\xd7\xe1\x50\x37\x28\xd4\x63\xaf\x29\xcc\x8d\xdc\x33\x80\xbe\xfc\xe0\x8b\x03\x74\x75\xc4\x3c\xb4\x29\x39\xb2\x83\xa1\x02\x0a\x45\x0f\xeb\xa1\xcc\xf0\xdd\x04\xb6\xab\x53\xad\xcb\x64\xda\x2f\x78\xe9\xa9\x54\x7d\xcd\xed\x9f\xe3\x6a\xa3\xd6\xbc\xbc\xbe\xbc\x3a\xab\xe5\x8e\x1b\xcd\x1a\x3e\xbf\xf6\x5f\x4a\xd3\x4b\x7c\xac\x1b\x44\xb5\x82\x8d\x2b\x43\x13\x94\x6f\x2c\xa2\xde\x95\x53\x1b\xa4\x0f\xf8\x78\x5e\x83\xe7\x6a\x5f\x57\x87\xb1\x06\xa7\xb0\x86\xad\x4c\x1a\xa6\x50\xcd\x21\xda\x64\x28\x29\x32\x69\x88\x01\x85\xe2\x7b\xdd\xf4\x1a\x01\xa2\x03\x09\x80\x31\x9e\x9c\xa4\x3b\x17\x8e\xda\xbb\x5b\x40\x84\xb9\x60\x6d\x1a\x8e\xaa\x1b\xc4\x8a\x0a\xff\x3e\xf2\x32\xf9\xe8\xf4\x41\xed\xe9\xce\xb3\x08\xca\xce\x26\xe2\x44\xea\xda\xe4\xef\x7c\x25\xc1\x1b\xb9\x1d\x16\x8e\xd7\xf4\x94\x04\xbf\x1a\x72\x7c\x83\x4a\xb4\x7f\x8e\xc1\x0e\xe5\x70\x03\xd3\xba\x2f\x1b\xa3\xe1\x70\x13\x21\x2b\xc6\x83\x82\xec\xd8\xd0\xf9\xae\xe0\x88\x67\x85\x65\xf8\xae\xe9\xe4\xbb\x5c\x99\x87\x29\x55\x28\x52\x4e\xd7\x28\xf8\x35\x22\x59\x70\xda\xca\xe1\x33\x03\x06\xec\x50\xef\x99\x00\x29\xa2\x13\x25\x33\xd3\x16\x6a\xa1\x56\xe4\x32\x45\x0b\x51\x35\x78\x97\xee\x6e\xa7\x93\xef\x42\x19\x39\x9d\x42\x97\xea\xb9\x9d\x62\x17\xda\xc8\xe9\xec\x74\xa9\x7a\xdb\x29\x75\xa1\x8e\x5a\xb4\x4a\x0f\x19\xa2\x0e\x8b\x54\x87\xed\xd1\x2a\x23\xd4\xeb\x14\xba\xe5\xa5\x34\xbb\x10\x58\x74\xcb\xda\xa6\xe5\x88\xed\x90\x07\x27\x67\xc8\x56\x78\xb6\x32\x18\x6d\x6c\x94\xd6\x08\x2d\xed\xb5\x61\x2f\xea\xc4\x5c\x54\x60\xb8\xa0\x07\x79\x51\x03\xea\x92\xf3\x4d\x2c\x66\xda\x02\xc6\xb8\x7a\x42\x8e\xcc\x64\xe2\xb4\xa4\xe7\xa8\x86\x36\x24\x62\xac\xce\x53\x4c\xc7\xcf\x3d\xc7\x1f\x39\x29\x8d\xbd\xe2\x54\x15\xce\xeb\x38\xb6\x50\x6c\x3e\x22\xe6\x7b\x92\xd3\x06\x7f\x48\x1a\x71\x2e\xd9\x2f\xaa\x1b\x79\x48\x3f\x99\x74\x01\xc4\x13\x31\x6a\x09\x1d\xb1\xba\x2d\x14\x9d\xb8\x6f\x57\x22\xa8\xd3\x85\x9e\xb1\xce\xd3\xd9\x2d\x62\xf8\x8a\x8a\x81\xf2\x65\xe3\xb3\x55\x36\x7c\x73\x93\x1c\x29\xd4\x31\xa8\x28\xaa\xdb\x0d\x63\xa8\x1b\xe4\x98\x3c\x92\xa1\x08\x2a\x84\x9b\xe8\x64\x20\x39\xfe\x2f\xcf\xd6\xd1\x21\xd0\xe9\x4e\xa0\xbb\x70\x1c\x9d\x2e\x34\xe8\x1f\x99\xfe\x51\x3d\x32\x44\x9e\x1c\x5f\x50\x84\x36\xca\x97\xed\xcf\x6a\xd9\xf6\x87\x65\x46\x0a\x75\xec\x6e\xd9\x8c\x51\x4e\x9f\x51\x92\x3e\x15\xcb\xcd\x29\xaa\xe6\x11\xbe\xcf\x85\x78\xa6\x27\xd0\x53\xf2\x42\x6b\x56\xa6\x2b\xfe\xd5\x30\xfa\xe4\x29\xc7\xf6\xe4\xe7\xbc\x3f\x75\x13\x48\xf3\x8b\x7e\xc9\x57\xac\xa0\xa8\x93\x5a\x49\xb7\xeb\x43\x53\xa5\x9a\x98\x08\x2a\x46\x50\x44\xf6\x7f\x45\x40\x0a\x2d\xaa\x38\x77\x27\xb0\x8d\xe2\x22\x4e\xa0\x43\xce\x1d\x0b\x99\x9b\x5d\x29\x48\xf3\xeb\x7f\x5e\x50\x7f\x2b\xde\x80\x4e\xb3\x62\x7d\xb2\x37\x95\x82\xb4\x55\x58\xb7\x05\x1c\x46\xf8\xd5\x37\x72\x73\xa7\x3b\x71\x49\x00\x5b\x9a\x8d\x48\x5c\xae\x41\x24\x17\x2f\x84\x48\x2e\x2e\x90\xd0\x12\x71\x91\xe3\xfa\xe2\x00\x9f\xd5\x10\x89\x0b\x26\xbe\xc1\x9b\xb3\xd2\x5f\x46\xf8\x7f\xb8\x11\xde\x40\xa2\x2e\x3a\xe2\x0e\x60\xa6\x68\x9a\xc8\x88\xbe\xc8\x03\x6e\xab\x2e\x50\xf5\x45\x17\x55\x6e\xa2\x2e\x81\x72\x60\x5e\xd6\xa3\xf6\x9a\x4c\x06\x47\x2d\xd6\x38\xb4\x58\xe3\xc9\x24\xa8\xd2\x7b\x0f\x13\x34\x5d\xcc\x21\xda\xfe\xb7\xe8\x98\x1b\xa0\x22\x52\x71\x6b\xec\x98\x0f\x63\x8b\xf2\x9b\xf1\x8d\xe9\x38\xe6\x3d\x10\x37\x66\x64\x80\xca\xff\x6c\xeb\x70\x44\xeb\x77\xb2\x5b\xdd\xca\xcf\xfe\xef\x3f\x73\x95\x9f\xfd\x2c\xf8\xd7\xc6\xd4\x1b\x5a\xb4\x85\xb6\xc5\x87\x27\x30\xfe\xd7\x58\xdc\xc8\x03\xfa\xc6\xa5\x95\x07\x96\x79\x3f\x76\xcc\x31\xb3\x9e\x6e\xd9\x8e\xf9\x00\x7e\x8a\x62\x45\x12\x3b\x3f\xfb\xb9\x6e\x16\x88\xff\x02\x15\xf8\xd3\xfe\x1d\x54\xc4\x5c\xb6\x02\x7e\xb2\x9a\x6d\xb4\xfd\xef\x9f\xf6\xef\x62\x4f\xb7\x7a\x43\x32\x26\xc3\xa1\xfe\x60\x13\x50\xa1\xef\xa2\x75\x1f\x9e\xc6\x56\x85\xdc\x8f\xff\x05\x68\x4e\x6a\x06\xa8\x80\x71\x6f\x68\xda\xc4\x76\xb6\x6c\xbd\x4f\x82\x87\x9e\x69\x19\xc4\x1a\x0f\x54\xcb\xb9\x0d\x32\x83\x27\x9e\xcb\x7b\xac\x48\xaa\xe3\xb5\xcf\x60\xd5\x23\x86\x43\x2c\x0e\x2e\x30\x4e\xeb\xf3\xa7\x9d\xa5\xa5\x29\x50\xbd\xc2\x1e\x54\x53\x4b\x83\x8a\x58\x91\x7e\xda\xe3\xff\x01\xdb\x3a\xd4\xa6\xe8\xc6\x4b\x52\x45\xca\xc3\xa4\x8e\x53\x98\x40\x65\x26\x1d\x7a\xe1\xe7\x8d\x52\x1e\xd6\x8e\x8f\x1b\x67\x17\x35\x5a\xbc\x8f\x5e\xe8\x5c\x24\x8a\x57\xb6\x2f\x18\x88\x42\xfe\x5f\x02\x80\x8e\xf9\x90\xfa\x9e\x4f\x25\x99\xb5\xcb\xf2\x18\x30\x92\x59\x85\x3c\xcb\xe3\x73\x4f\xcf\x9c\xc0\xfa\x34\x45\x4d\x9e\xd4\xf4\x52\xce\x52\xb5\xa4\xe6\xc8\xf3\x18\x9a\x5d\x38\xe6\x83\xed\x9f\xb6\xf4\x75\x2a\xa9\xe9\xa6\x81\x9c\x09\xac\x4d\xd3\xf3\xc4\xb1\xb0\x05\x8d\x59\x1d\x26\xc0\x3b\xab\x43\x9b\x6a\x83\xfe\x69\x2e\x87\x19\xb2\x12\x67\xbb\x70\x80\xc4\x24\xa7\x49\xf2\x3a\xef\x34\x8f\xd9\x90\xa0\x81\x7c\xb3\x16\x94\x29\x8f\xb2\xc8\x40\x7f\xf2\x84\x3c\x61\xc8\xc0\xb7\xe5\xdb\xc3\x04\x84\x90\x51\xb9\x15\x2d\xe8\xc0\xcd\x4d\x19\x48\x42\x2c\x27\x93\xf1\x2a\xd0\x27\xab\x93\xef\x56\x6e\xc5\x8e\xe0\x98\x1b\x7c\x9d\x84\x2e\x65\xc6\x3d\xd5\x11\x9f\x45\xcb\xb3\xeb\xed\x00\x4a\x06\xbd\xc6\x2c\x06\xbf\x44\x6f\x07\x22\x86\xc2\x96\xcb\xb8\xea\x16\x7d\x25\x57\x1e\x45\x0b\x48\xcc\x10\x3f\xd5\x3f\x6f\x22\xe8\x9f\x56\x7e\x16\x1f\x83\xee\x0a\xac\x3b\x20\x71\xee\x34\x2d\x05\xf8\xac\xca\x93\x0c\x49\xd9\xf8\x8c\xfd\x83\xd0\x40\x32\x55\x11\xee\x18\x54\xc3\x6a\x71\xeb\xa0\x0a\xa0\x8e\xd4\xdc\x50\xb5\x1d\x26\x8f\x9c\x0e\x44\x61\x43\x60\x4a\x17\x71\x37\xe4\x00\x31\xcd\x8a\x9a\xb3\x47\x37\x54\xc8\x30\x34\x31\x0f\x75\x20\xa9\x54\x23\x33\x2b\x71\x04\x8e\x96\xd2\xb3\x05\x00\x24\x03\x21\x44\x2a\x29\x3b\x87\xe5\xf8\x23\xdc\x2a\x54\x52\x77\x82\x44\x35\xe8\xb2\x27\x07\xbe\x30\xb4\x92\x7a\x90\x12\x4c\x69\x38\x01\x13\x7f\xce\x23\x64\xe5\xee\xd5\x07\x71\x5a\xeb\xc4\xfe\x79\x17\x3b\x4c\x30\x1f\x3c\xec\xf0\x9a\x22\xbc\xa9\x3c\x42\xc8\xa9\xe4\x25\xab\x62\x51\x75\x01\xdf\xd8\xe6\x70\xe4\x90\xaf\x94\x73\x8b\x0e\xd8\x76\xd8\x30\x26\x13\x00\x5d\x34\xa2\xba\x38\xad\x05\xdb\x28\x5f\x6e\x7f\x1e\xf9\x30\x6e\x67\xb3\x80\x32\x63\xae\xf2\xbb\x7c\x00\x1a\x1a\x75\xda\xbc\x7c\xd9\xcb\x44\x08\x69\xe1\x6a\x29\xa8\x5d\xf6\xde\x8e\x3a\x8a\x57\x12\x28\xd9\x6c\xd9\x2f\xd1\x47\xca\x56\x3b\x5b\x80\x75\x24\x06\x25\xb6\x5c\xb0\xdd\x2f\xb7\x3f\x2b\xac\x57\x37\xec\x04\xb9\xd9\x3a\x3f\xb5\x73\x91\xe6\x4b\x03\xa3\x09\x80\xb7\x33\x76\x92\x98\x87\x06\xdf\x72\x98\xaa\x6d\x40\xc4\x9d\x7c\x97\xb2\xf5\x21\x47\x10\xfe\xa8\x22\x79\x3c\xf6\x8d\x19\xe3\xf1\x28\x9a\x67\x23\xb5\x12\xd8\x39\x1e\x44\xa7\x62\x6d\xe5\x76\x7f\x67\x66\xb3\xb3\x86\x64\x41\x02\x24\xb9\xd2\x60\x85\xe9\xef\xa3\xe0\xd7\x83\xe8\x15\x82\x84\x61\x61\xa5\x20\xe5\x61\x8f\x1b\x39\xef\x75\x43\x14\xf3\xd0\xcc\xf5\x75\xce\xf6\x01\x2f\xac\xde\xd8\xa2\x9d\x7b\xca\x83\x6c\xf4\xb1\xe0\x99\xe9\xf8\xe3\x73\x3c\xf7\xb9\x00\x00\x2c\xfe\x4e\x3c\x35\x93\xfe\xf2\x6c\x76\xbe\x3a\x48\x31\xaf\x2e\x0e\x44\x0c\x75\xd8\x03\xd0\x06\x13\x78\x30\x8b\xf0\xd0\xd5\xbf\x67\x12\x5b\x9b\x8a\x43\x56\x26\x23\x0a\x9c\x21\xf3\x8d\x5b\xe8\x8e\xc7\x7c\x87\x52\x78\x74\x76\xba\x99\x0c\x7f\x64\xb9\xbb\x5d\x50\x51\x3c\x57\x17\x49\xc9\x79\xac\x07\xca\xe8\x65\x02\x6d\xf4\x32\x29\xd3\xf6\x12\xd5\x45\x39\xf7\x94\x38\x20\x3d\x66\x18\x57\xb7\xcc\x7b\x86\xa2\xdf\x74\xe7\xb6\x6d\xe8\xcc\xdc\x48\xeb\x40\xab\x53\xea\x82\x14\x4c\xe6\x20\x00\x00\x46\xba\xd8\xe5\x5d\x3c\xaf\xd2\xc5\x2e\xed\xe2\x43\x7a\x17\x1e\x6c\x01\xb4\x3a\x1f\xbb\x15\x3b\xf7\x84\xfa\x1d\xfa\x33\xe7\x98\xc7\xa6\x4b\x2c\x45\xb5\x89\x08\xba\x52\x64\x08\x7b\x74\x08\xf6\x6a\xb3\xdc\xa3\x43\xf8\xd4\x65\xfd\x14\xf2\xb4\xa3\x67\xd6\x51\x21\x3f\xaf\xa7\x42\x81\x77\xb5\xd2\x6c\x0b\x05\xda\x57\xa1\xd8\x05\x80\xdb\x17\x4c\xf4\xf2\x24\x05\xab\x6a\xe7\x9e\xfc\x63\xe5\xed\xa2\x64\xe7\x9e\x66\x03\x1e\x3e\x47\xab\x3d\x07\xa7\xca\xac\xde\xf3\x1c\x68\x4e\xa0\x8e\xee\x45\x2b\x93\xb1\x3a\xc5\xee\x78\x2c\x24\x24\x32\x01\x1a\xd0\x84\x32\x8c\xa3\x74\x4d\x1c\x88\x04\x5a\x6c\x5b\x05\x9b\x4a\xcf\x3d\x41\x3d\xf7\x0c\x00\xab\xa2\x83\x09\x7c\x40\x69\x2a\x91\xbf\x5d\x28\xaf\xf5\x8c\x31\x06\xca\xed\xfe\xee\x40\x99\x26\x16\x54\x51\xb8\x23\x1d\xbe\xdd\x6d\x9d\x12\xde\xc8\xe6\xb3\xf8\xfb\x9e\x69\xd3\xf7\x60\xbb\x08\x6d\x64\x64\x23\x65\x7f\x57\xa1\x89\xe4\xad\x48\xa9\xdf\x55\x9f\x42\x3f\xe5\x25\x1b\x3e\x15\x24\x67\xcb\x86\xcf\x79\xc9\x84\xcf\x05\xc9\xda\x32\x27\x13\xd8\x44\x29\x87\xc0\xbc\x53\xd6\x88\xbf\x18\xdb\x49\x12\xe2\xe5\x40\xec\xc3\x75\xbb\x08\xc0\x04\x36\x12\x10\xf0\x2c\xf4\x98\x1b\xe7\x05\x4f\x02\x90\xd8\x83\x63\x6e\x38\xe6\x83\x20\x79\xbd\x3e\x88\x79\xaa\x67\xb1\x2c\x2a\x3a\x86\xa5\x98\xec\x17\x29\xe7\xd1\xba\xed\x62\x50\xde\x2b\xe1\x57\xe0\xd5\x83\xf2\x3b\xbf\x4f\xd7\x70\xcc\x87\x8d\x68\x2d\xf6\x9b\x8f\xc7\x6f\x85\x0f\x76\x23\x3e\x16\xfa\xe4\x0b\x32\x53\x23\xca\x36\x45\x02\x62\x5d\x44\x2a\xb3\x9a\x69\x1d\x24\x06\xcf\x47\x32\xab\x8b\xad\x58\x17\xd3\x43\x8c\x8d\x2f\x02\xe6\xf4\x5e\xe2\xf0\x4f\x6b\x7a\x1a\x46\x69\x8d\xa7\xc0\x28\xde\x74\xf1\xf7\xd4\xf1\xa7\x80\x43\x90\x02\x97\xab\xc4\xd4\x21\x01\x93\x09\x3c\x4a\xdd\x63\x38\x67\x3f\x0c\x75\x87\x49\x5c\x4c\x7c\x61\x7c\x98\x99\xb4\x18\x6f\x11\x1d\x58\x64\xc7\x54\x94\x61\xaa\xc8\xe8\x14\xba\xd0\x46\xf2\x76\x21\x9f\xf7\xd9\xd9\xb6\xa8\x7a\x8f\x09\x9e\xe6\x0d\x40\x75\x54\x43\xd4\xed\xa6\xda\x14\x6d\x50\x29\x48\xb6\xb7\x3b\x3d\xb4\x9a\xc0\xcb\x04\xa3\x0b\x1d\xd4\x3a\x2f\x4f\x52\x1e\x3e\x4b\xf9\x09\xf4\x7e\xf9\xdb\x86\xbd\xf0\xf7\x92\x5f\x20\x7c\x0e\x8a\x75\x73\x16\xe9\x8f\x7a\x51\x9f\x0d\xaa\x47\x70\x0b\x69\x62\x6b\x92\x2d\x23\xf7\x04\x9d\x2d\x23\xf7\xec\xcf\x41\xb4\x2a\xf2\x67\xcc\xcc\xbf\xf7\xa3\xfb\xaa\x57\x54\x92\xbf\x4c\xbd\x03\x95\x17\xef\x8d\xc2\xe8\xa1\x64\xc0\xa9\x5a\x13\x09\x4f\xe0\x4b\xf2\xb5\x55\x29\x6c\xe7\xa5\xad\xc2\x76\x1e\x26\x5a\xa0\x02\x1f\xc8\xc5\x5e\x4e\xe0\xfd\x14\xb4\xc2\x09\x39\xb9\x27\xa8\x22\x27\xf7\x0c\x6d\x94\x87\x3a\xca\x97\x13\x74\x24\xaa\x70\x0b\x12\x41\x08\xf9\xa2\x40\xc5\x46\x7a\x28\xf7\x04\xe4\x53\x8e\x88\x35\xf2\x96\xe1\x33\x91\xe0\x9d\x1a\xfd\xbd\x65\x04\xac\xd7\x6b\xdb\x93\x2e\x28\xc3\x5b\xba\x71\x2a\x88\x4d\x97\x9d\xd5\x51\xf4\xc8\x51\x88\x9b\x10\x04\x49\x1f\x88\xd1\x39\x82\xd8\x1c\x13\xab\x2f\x43\x15\xc0\xe9\x77\x61\x57\x53\x99\xfe\x88\xd3\x2a\x86\x79\x91\xb1\x96\x99\x54\x1c\x0c\xca\x03\x0e\x5f\xbc\xde\x0a\x73\xde\x5e\x1e\x94\x43\x74\x29\x1a\x50\x86\x2a\xdc\xcc\x83\xb2\x8e\x7a\xbf\x8b\x76\x12\xef\x87\xb9\xa7\x2d\x19\x8a\xc3\xdc\xf3\x96\x0a\xb6\x7b\x00\x4c\x22\x20\x8d\x99\x61\x66\xa2\x8c\xfa\xf4\x8e\x28\xb3\xb8\xf1\x10\x65\xa2\x65\x97\x42\x99\xa4\x18\x33\x07\x67\xd4\xa7\x7f\x18\xce\x8c\x56\x98\xf4\xf6\xf2\xb0\x6c\x85\x38\x53\xa0\x38\x33\x4a\xc1\x99\x16\xc7\x99\x16\xc7\x99\x51\x80\x33\x3e\x0f\xb2\x91\x95\x7b\x1a\x8f\x29\x11\x0a\x65\xdf\xdc\x73\xc5\xca\x3d\x4b\xf6\xc4\x17\xaf\x24\x1b\x3e\x4b\xfa\x64\x02\x1f\xd1\x32\x47\x00\xd3\xaa\xb5\x20\x40\x87\xfe\xb1\xe8\x1f\x83\xfe\x91\x51\x1e\xaa\x68\xfb\xdf\xd3\x16\xc1\xf1\xcf\x7e\x56\xac\x48\xa1\x7d\xaf\x02\x98\x79\x2f\x3b\x6d\x0e\x4c\x29\xca\xcd\xae\x36\xda\xfe\x37\xcd\x8b\xe4\xf0\x36\x12\x2f\x79\x69\x13\xe1\x8e\xec\xeb\x6a\x2a\x28\x9b\x99\x8c\x9c\xcd\x32\xf9\x5d\x8f\x66\x6d\xff\x3b\xd5\xa0\xfa\x6a\xeb\xe8\xd8\x3b\xb4\x19\xf7\xcc\x47\x62\xb1\xb1\x80\xb2\x9e\xc9\x88\x04\xe9\x4c\x3b\x14\x04\x28\x78\x65\xa8\xca\x28\x5a\x48\xe7\x42\xbd\x00\x2a\x16\x4a\x70\x09\x81\xb5\xc2\x54\xcb\x4c\x46\xb4\xd0\xd4\x96\x01\x50\xce\x66\xb9\x5a\xd2\x8b\x4e\xcb\x06\xe5\x5e\x38\xe3\x61\x02\x18\xc3\x30\x6b\x94\xa8\x35\x0a\xb3\x5a\x68\x38\x1e\x9b\xe5\x56\x26\xd3\xea\x30\xc5\xc9\x40\xf4\x47\x56\x64\xeb\xf0\x3f\xdb\xdc\x0a\x40\x5f\x81\x8a\xf0\xf0\x24\x48\x82\x00\x60\xab\x53\x64\x45\xb3\x48\xd8\x10\xb2\xf4\x69\xaa\x7c\x31\x52\xde\x53\xa9\x5c\x34\x1a\x8f\x7b\xbe\xf0\xe2\x66\x32\xa2\x83\x5c\x2a\xf6\xb8\x0c\x66\xa2\x93\x45\xb4\x06\x00\x70\xd3\x18\x8f\xc9\x78\xec\x8c\xc7\x16\x7d\x8f\x0c\x86\x7a\x00\x1a\x6c\x7c\x82\xea\x6c\x08\x59\x03\xc0\x4e\x87\x40\x0b\x3a\xd0\xe8\xe6\x06\xfa\xd0\x21\x56\x8a\xe3\xe8\xe6\x26\x9e\x80\xdc\x1f\xa6\x6e\x30\x11\x2c\x30\xf1\x61\xcf\xe2\x26\x53\xe5\xe0\x19\xa5\x7a\x9c\x26\xad\x4d\x91\x0c\x0a\x48\x17\x4c\x40\xbc\x0c\x33\x22\xe8\x03\x71\x93\x04\x47\x56\x1d\xa7\xeb\xcb\x08\x84\x02\x91\x8b\x09\x03\x2b\x22\x42\x93\x4e\xa9\x9b\x15\x36\xf2\xff\x12\x7c\xd9\x33\x99\xc5\xec\x64\x1e\x07\x0e\x4e\x13\xfc\x42\xc2\xbf\x28\xea\x90\xce\x4e\xb7\xe2\x15\x17\xb2\xa4\x53\xec\x4a\xc1\x13\x15\x1e\x43\xb1\x53\xa4\x99\x20\x2b\xfc\x4b\x98\x30\x37\xc0\xf7\xb8\x80\xb4\x9d\x3c\x28\x11\xfb\x44\x1b\x6b\x96\xda\x1f\xd3\xff\x74\xd8\x60\x5b\x2f\x93\x88\x55\x0a\xa5\xd9\xf5\x38\xa0\x2d\xe6\x55\x15\x88\xd4\xb1\xa9\x14\xba\x20\x84\x6f\x31\x61\x17\xf0\xa0\xdd\x27\x5a\x00\x51\x4f\x32\xfe\xdd\xd9\x2e\xec\xe5\x39\x48\xe9\xb0\x92\xf9\xdb\xc5\x7c\xfe\x77\xc7\xd3\xe1\x22\xd9\xde\x2b\x06\x77\xff\x5d\xa0\x42\xfc\xee\x04\x87\x73\xdc\x96\xb8\xf6\x53\xdc\xde\xd0\x34\xc8\x37\xdd\xe8\x9b\x2e\x22\xb9\xaa\xd9\x1b\xdd\x13\xc3\x51\xe8\x5b\xeb\xd7\x31\xeb\x7f\xd9\x31\xeb\xff\xc2\xbb\x4e\x32\xbf\xeb\xc4\xae\x3c\x7d\x00\xd0\x46\x23\xd1\x11\x77\x77\x81\x7f\x96\x0c\x75\x7e\x95\xa9\xc7\x32\x0a\xbb\x80\xdf\x6a\xda\xfd\x10\x39\x65\x1e\x2d\x7d\xca\xcc\xf9\xdb\xd4\x3e\x99\x79\x33\x8a\xfb\x8f\xfc\xad\xf7\xa3\x2c\x32\x20\x16\x31\x7a\xa4\x36\x24\xf7\xcc\xa7\xc2\x3b\x4a\xeb\x59\xe6\x70\x48\xfa\xde\x6b\x9b\xf9\x04\xf1\x53\xb7\x87\x67\xe6\x8a\x6f\x23\x83\xbf\xd1\x99\xd3\x11\x73\x46\x0f\xde\x0d\x4d\x4d\x0b\x0f\xdf\xc2\x6b\x57\x11\x6f\x2a\x62\x21\xd9\x7f\xe6\xde\xab\xc7\xa6\xda\x27\x16\x8a\x9f\xd1\x50\xa0\xb8\x8c\xe0\x78\x23\x7e\xb0\xc9\xa8\x6f\x7a\x0e\x73\x55\xd5\x51\xd1\x4b\xcf\x1c\x51\xd9\xce\x96\x5e\x26\xf0\xcf\x91\xe9\x90\x2a\x79\x70\x6e\xa5\xfc\xc4\x3b\x87\xf4\xc0\xef\x4f\x91\xcf\x83\xae\x05\xbb\xb6\x44\x72\xa6\x6b\x10\xcb\x5f\xa4\x64\xf1\xe0\x7e\x98\x11\xde\x0f\xe3\x53\xc6\xc3\x21\x9f\xf5\x62\xff\xd1\x29\x40\x65\x32\x38\x62\xa1\x61\xd7\xaa\xce\x2c\xf3\x5e\xb7\x49\x4e\x1d\x0e\xa9\x1a\xa2\x73\xde\x94\xb8\x2f\x00\x44\x27\x79\x03\x00\xcc\x90\x13\x7c\x8f\x7f\xec\x1d\x5f\x32\xa7\xfe\x28\xa4\xa3\x03\x12\x71\xe0\x31\x9f\x73\x6e\x89\x91\x2a\x77\x64\x32\x02\x3f\x76\x0b\x2f\x32\xe1\x9c\x6d\xf5\x2a\xbf\x8d\xac\xa1\x28\xfc\x96\x65\x4f\xd9\xdf\x04\xf0\x9b\x24\x18\xa6\x41\x84\x09\xc8\x71\x9a\x18\x6d\x2e\x3f\x01\x92\x3f\x59\x3a\xa2\xe1\x23\x11\x05\x21\x8b\xbd\xb3\xd5\xac\x3f\xe0\xac\x20\xd2\xb7\xec\x5e\x02\x17\xa0\xa0\x00\xb2\x02\x10\xc0\x04\xa4\x8c\xd2\x3f\xe6\xfb\x52\x60\x24\x3b\xe1\xc9\xc7\xe4\xb7\x29\xd8\x21\x1c\xb6\x3c\x01\x30\xb6\xc9\x0e\x2e\x4f\x8e\x59\x21\x0f\x11\x3c\x27\xc4\xb9\x30\xb4\xad\x5e\x72\x64\x7c\x03\x93\x4c\x66\x41\xe3\xfe\x2d\x13\x8a\x93\x21\x6a\x84\xef\xb8\xaf\xba\xc9\x36\xa0\x72\x71\xc1\xf7\x60\xe0\x0e\xef\xf3\x66\x86\xd1\x9b\x05\x00\xca\x4e\xce\x22\x0f\x43\xb5\x47\x94\x5b\x7d\xd8\x17\x2d\x88\xc1\x64\xd6\x72\x84\xce\xb6\x7c\x3a\x75\xd3\x70\x16\x61\xb5\x87\x14\x51\xac\xe5\x0c\x9d\xca\x96\xfe\xb0\x2e\x6e\x09\x71\xec\xa4\x94\x1a\x71\x0c\xbe\xb5\xc8\xa0\x32\x20\x4c\x7c\x62\x0f\x73\xd0\x8f\xdd\x1a\x14\xa9\xd0\x3b\xab\x48\x9b\xf9\xc2\xb3\x66\x52\xa7\xea\x19\x1d\xbb\x13\x20\xb9\x22\xa1\x10\x01\xf3\xfa\x9b\xb6\x2c\x26\x7c\xf9\xa8\x20\x4f\xc0\x04\x76\xba\xf3\x46\x15\x03\xd1\x2c\xa1\x9e\xc3\x00\xe7\xa8\x7e\xac\x3a\x36\x3b\x00\x9e\x46\xa6\xd8\x7d\xb4\xa1\x79\x33\x17\x1a\x94\x90\x7a\x7d\x27\x54\x04\xce\xc2\xd9\x91\xa4\x3e\x24\xe7\x84\x62\x72\xd9\xca\x51\xee\x64\x99\x16\x72\x20\xfd\x3d\x34\xd5\x7e\xf2\xba\x1a\x46\x16\xdd\x00\xa3\xa1\x53\x66\x77\xb8\x20\x7d\x54\xfb\xd8\xa6\x84\xb8\x7d\x7e\xcc\xbc\xba\x27\x29\x5b\x20\x18\xf5\xc0\x34\x9c\xba\xda\x23\x39\x9b\x38\x01\x93\x17\x6c\xab\x27\x40\x9f\x8a\x10\x46\x41\x00\x14\xfe\xff\xb4\xf0\xd6\x40\xed\x91\x8d\x17\x4a\x09\x82\xba\x3d\xdb\xbe\x24\x4f\x0e\x55\x2e\x68\x77\xd3\x3d\x06\x73\xc4\xb9\x9e\x45\x54\xc7\xdf\x66\xa2\xc0\xd0\x52\x00\x65\x7e\x07\xd5\x63\x23\xc8\xf1\xc8\xc0\x4f\x43\xa0\x62\x6e\x82\x05\xe4\xd4\x87\x07\x62\xf4\xbd\x8d\x14\xbd\xbc\x14\x6b\x9c\xb1\xf7\x25\x79\x41\xc8\x46\x53\x08\x83\xa2\x1a\x8f\xaa\xed\xf3\x9f\x80\x16\xc4\xd9\x54\x62\x5e\xfa\xbd\x26\x00\x26\xe7\xfa\xe2\x10\xc5\x1f\x84\x73\x8e\xe9\xaf\x0d\x80\x4e\x28\xa1\xe6\x27\x13\x2a\x82\x4f\xd1\xa4\xba\xa5\xde\x93\x58\xd7\x0c\x88\x51\xda\x02\x0d\xd4\x64\x77\x40\x6d\xe2\x60\xc7\xb1\xf4\x9b\x91\x43\x44\xa1\xaf\x3a\xea\xd6\xad\x73\x3f\x2c\xf6\xd8\xf8\xb7\x74\xca\x94\x0d\x75\xb8\xa5\x0f\x68\xa3\x5b\x77\xe4\x59\x80\x06\x57\xd1\xd8\xc5\x25\xd9\x63\x71\xfc\x52\x92\x88\x61\x1e\xe6\xd9\x59\xbf\x67\x26\xd3\x91\xea\xdf\x84\xf5\x27\x95\x42\x81\x7b\x6a\xef\x96\x74\x8c\x2e\x3a\x12\x71\x4c\xde\x98\xbd\x33\x48\x20\x83\x88\x18\xbe\xa8\xf6\xb3\xd1\x93\xc2\xcb\xc4\xec\x19\xaa\xc3\xa1\xe9\x5e\xaa\xba\xe1\x44\xb3\x82\x97\x30\xc1\x5f\x24\xe1\xff\x37\x60\xff\x04\xc8\xa7\xcf\xac\xfb\x90\x5d\x4f\xbb\xd4\xef\x89\x39\x8a\xb6\x13\x7d\x0d\xa9\xb0\xa4\x1b\x5a\x24\xdb\x7b\x03\x1f\x2c\xf3\xe9\x39\xf2\x9e\x3d\x43\x8b\xdc\x9b\x8f\xec\xca\x00\xf3\xdb\x8d\xe4\x27\x72\xa0\xdd\x53\x87\x24\x92\xcf\x9e\xe1\xc0\xb4\x88\xae\x19\x5c\xde\x3e\x67\x80\x88\x77\x9f\x5e\x00\x8e\x6c\xa2\x9c\x9e\x5f\x44\x0a\x7a\x6f\x20\xf7\x82\x67\x7e\x66\x3d\x5f\x72\x83\xfc\x12\xb4\x0d\xbd\x4b\xcd\x3a\xf4\x8e\x7a\x3c\x71\xee\x1b\xcb\x4e\x62\xb5\x57\xf9\xab\x4e\xdc\x9c\x6e\x18\xc4\x62\xc5\xbc\x2a\x07\xbc\xa5\x85\x75\x78\x39\xc8\x65\xd8\xef\x73\xcb\x3f\xa8\x1a\xf9\x7e\x3a\x18\xd8\xc4\x2f\x7f\xb5\xb0\xfc\x15\x2f\x3f\x81\xc4\x93\x73\xb9\x1f\xbe\x68\x80\x79\xa4\x2f\x95\x1a\x3b\xe1\xd1\x4e\x7f\xee\xc6\x96\x53\x08\xb2\xbf\x27\x18\x0b\x92\x03\xea\x6d\x40\x99\x6d\x7d\x12\xdb\xfa\x56\x44\x94\xc8\x64\xa2\x4f\x71\x39\x21\x5d\xc6\x98\x0d\x10\x8d\x38\x8a\x79\xff\x30\x72\x48\x9f\x15\x17\x31\x08\xee\x8e\x03\x68\xa5\x12\x19\x56\x30\x22\xf8\xd8\x54\x4a\x08\x7e\x50\xea\x7e\x3e\xa2\x1d\xbf\x70\xb3\x62\xa7\xcb\x6d\x65\xb9\x1e\xe7\xa0\xf1\x52\x90\x5d\x7d\x4d\x32\x6a\x07\xbc\x44\x69\x61\x26\xe3\xf8\x4c\xa3\x82\xb3\xc1\x6f\x09\x7b\x04\xd1\x8a\x90\x06\x6f\x4d\x87\xa6\x26\x0a\x6d\x83\xa9\xce\x8e\xb9\xa1\xf6\x7a\xc4\xb6\x37\xbc\x8a\x1b\x0f\x1e\xeb\x12\xa0\x93\x33\xd4\x7b\x02\x20\x9e\x4c\x20\x95\x31\x47\x49\x72\xe9\xd3\xae\x51\x8c\xe3\x0c\xe1\x68\x12\x8a\x12\xd1\xf2\x21\x73\xf1\xdf\xce\xe6\x29\x38\x67\x98\x7d\x42\x35\x40\x84\x10\x5b\xcc\xcb\xda\xf7\xcb\xeb\xe6\x69\xb5\x56\x49\x20\x54\x10\xa6\x81\xd7\x61\xce\x1f\xde\x05\xac\x69\x2e\xc6\xaf\x51\xcd\x59\x77\x68\xa1\xd8\xb2\x3a\x39\xba\xb0\x5e\x13\x15\x27\x0d\x2d\x38\x41\x34\x56\xad\x07\x05\xe9\x86\x50\x8a\xe4\x39\xea\x41\xf9\x15\x2d\xa8\x03\x87\x58\xbe\xa7\x5f\xba\xe2\x8b\x10\xce\x64\xc8\xcc\x96\xfd\x2b\x7c\x6c\x51\xfa\xe7\x53\x6a\x33\x80\x29\x75\x65\xb3\xff\x1c\xd4\xbf\x15\x09\x08\x1c\xee\x18\xff\x1b\x72\xfe\xa7\x70\xf5\xf5\x9c\xd8\xc4\x01\xa2\x35\x43\xcd\x65\x11\x5a\x68\x1d\x4f\x65\x3a\x8b\x16\xa0\xcc\xd3\x98\x59\x51\x47\x38\x37\xd0\x2d\xdb\x61\x5b\xbc\xac\x97\x75\xa4\x33\x23\xd7\x85\x7e\x33\xd4\x0d\x0d\xe8\x53\x68\x54\x3b\xae\x9d\xd4\x9a\x1c\x93\x32\x19\x51\xb8\x50\xce\x1b\x67\x97\x54\x9d\xe4\x65\x9b\xea\x3d\x19\x8f\xf5\xdc\xad\x6a\xcf\x15\x01\x34\x83\xad\xdc\x78\x2c\x04\x26\x88\x30\x08\x46\xec\x1e\x37\x2b\xe9\x9b\x1b\x3c\x5d\x2b\x3d\x53\xd4\x01\x18\x8f\xa7\xc4\x28\x81\x05\x04\x48\x0e\x91\xc4\x84\xb7\x84\xea\xaf\x03\xff\x54\x63\x2e\x64\xe5\x59\x90\xa5\xe2\x1c\x5f\x47\xf3\xc1\x5b\x45\x1b\x88\xea\xcc\x85\xc0\x73\xd0\x6b\x36\xea\xf9\xb7\x79\x0d\x0f\x2a\x09\xeb\x83\xa8\x30\xeb\xae\x01\x6d\xd8\x07\x00\xca\x73\x4b\xc9\xb0\x07\xeb\x00\xc0\x4d\x6b\x3c\xde\x4c\x80\x70\x3c\x9e\x2f\x0e\x8e\xc7\x69\xcc\xc1\x82\x04\xc0\xd4\x1e\x09\x80\x79\x66\x7f\xe0\x8c\xf5\xd2\x7c\xc8\x64\xa2\x2f\x8e\xc9\xc0\xf1\xd6\x31\x69\x6e\xe2\x06\xd7\x0e\x81\xd1\xb2\x30\xd2\x52\x17\x40\x1c\xac\xb2\x67\x66\x57\x70\xf3\x2b\xbe\x10\xa4\xa9\x69\x69\xdc\x82\x1a\x39\x14\xa6\x54\x12\x9f\xd7\xb0\xe7\x63\x73\x51\x3b\xae\x29\x97\x82\x44\xb8\x85\x17\x61\x9e\x4e\xa6\xae\xf2\xc5\xae\xcc\x85\xda\xa0\x88\x03\x76\x54\x89\x29\xc1\x01\x2b\x93\x3a\x5d\x30\xfb\x90\x88\xea\xb6\x7c\xf3\x29\x17\x17\xb4\x42\xae\x7e\xda\xbc\xbc\xae\x63\xa5\x76\x7d\xde\x3e\xae\x4d\xa6\x6d\x3c\xa1\x85\x76\x8e\xad\xc8\xbf\xee\xae\x85\xba\x16\x77\xfa\x63\x0a\x17\x00\xfe\x0d\xbf\x7c\xd9\xf8\xec\x44\xfd\xb8\xf5\x81\x18\x04\x8c\xe8\x18\xdd\x30\x58\x44\xc7\xc8\x16\xba\x99\x8c\xc0\xd5\x54\x2f\x3f\x5b\xf0\x4b\xf8\xc2\x0c\x49\x4a\x31\x2a\x93\x61\xa8\x66\xce\x1b\xf4\x8c\x4d\x90\xe4\x6e\xcc\xfe\x73\x26\xc3\xd3\xd8\x5e\x95\x7d\x4d\xe1\xc5\xb6\x7a\x12\xaf\x0c\x79\xbf\x92\xd7\xa9\xd7\xca\xc4\x77\xde\x56\x7d\x63\xdd\x8b\xa7\x46\x4b\xd6\x6c\xa0\x6f\xff\xdb\x35\x07\x03\x3f\x84\x85\xaf\x79\x53\xa9\xc5\xd7\x33\x25\x0f\x7e\x93\xc9\xfc\xb5\xf3\x3a\xf3\x00\x38\x01\xd3\x17\x00\xf9\x4a\x05\x1c\x59\xbf\x7f\xe0\x80\x61\xf1\x90\x3c\x58\xd1\xfd\xe6\xb3\x5a\x91\x4a\x12\xd6\x4c\x99\xf0\x86\x22\x2d\xd5\xc0\x18\x40\x09\x83\x93\x31\xb3\x74\xa0\xf2\x7a\x82\x68\x4c\x0e\xc1\xd0\xc9\xdd\x12\xb5\xcf\x23\x11\xa9\xfd\x84\xae\x0b\x1d\x6f\x81\x9c\xe9\x05\x32\x00\x34\xb8\x30\x56\x71\x45\xef\x17\x74\x28\xaa\x4f\xa0\x96\x00\x00\x15\xc6\xf8\x19\x9a\xe7\x54\x86\x7c\x5f\x2e\xdf\xab\x0c\xf9\x2e\x5d\xe5\xc8\x9d\x7a\x85\xdf\x24\x15\x85\x62\x9f\x01\x84\x4c\xbd\x2c\x3b\xec\x06\xa7\xc3\x30\x9e\x52\x59\x91\x89\x00\xe1\x63\x1e\xe6\xe1\x94\x4f\x26\xd3\x34\x25\x2b\x12\x04\x89\x2b\x9f\x93\x50\x41\x9e\x4c\xa0\x92\xea\x89\x45\x55\x78\x26\x4f\x72\x08\x66\x32\xdc\xd4\xb9\x89\x50\xf4\xdd\xd6\xbd\xf9\xd7\x96\x3a\x74\xb6\xbc\x57\xc9\xfc\xb0\x4e\x5f\xb7\x1f\x86\xea\x73\xb8\x75\xe6\xea\xf9\x11\xee\xca\x19\x0c\xe1\x39\x82\xcf\x8c\xa6\x08\xb4\xc3\xe5\xf1\x50\xf2\xb0\x66\x5e\xde\xed\x21\xab\x63\x07\xe7\xc5\xbd\x68\xf4\x88\x61\xee\xec\xa2\xd6\xae\x9e\x5e\x2b\xa7\xcd\x4b\x2a\x19\x34\x2e\x6b\x27\x3c\xee\x43\xe3\x04\xef\xd7\x24\x7e\xce\x4f\x96\xb1\x52\x8c\x98\x7e\x32\x87\x6e\x09\xcc\x12\x94\xed\x71\x32\xcc\x4c\xbe\x9d\x7c\x48\x34\x46\xf1\xdb\xc2\x48\x28\x08\x50\x8e\xa1\xe6\x28\x16\xa8\x62\xce\xd8\x29\x23\x90\xe2\x75\xd3\xa7\x10\x88\xcf\xde\xa0\x40\x78\x1e\x25\xe7\xd8\x49\x0b\xe5\x44\xa8\xc6\x0e\xbc\x07\xcc\x1c\xeb\xbd\xcb\x22\x03\x21\xd4\xaf\xd0\x8c\x9a\xc4\xb3\xf9\x1b\x92\xd3\x0d\x9b\x58\x8e\xcc\xe4\x5b\x51\x86\x24\x22\xa6\x01\x89\x24\xc8\x21\x94\x27\x13\xd8\x47\x81\x3c\x0c\xeb\xc8\x97\x6c\x61\x0d\x09\xd7\xd7\xd7\x11\xe4\xb8\xbe\xbe\x8e\xe1\xc7\xb5\x5f\x69\xb0\xb0\xa4\xd7\xe4\x6d\xec\x44\x9c\x5d\x33\xca\x09\xd9\x5a\xb6\x9f\xfd\xed\xe5\xa7\xb1\xb1\xb1\xb1\xe1\x61\xb3\xb4\x21\x08\x1b\x9b\xfa\xfd\x83\x69\x39\xaa\xe1\x94\x79\xa6\x87\xd6\xd2\x06\xc5\xf4\x78\xf6\x84\x97\x60\xff\x72\xbf\x65\x07\xd9\xfa\xdb\x9b\xfc\x6d\xea\x42\xc5\x92\x86\x33\x9f\x3a\x3a\x9e\xed\xe0\xf2\xe4\x18\x51\xb9\x23\x26\x36\x26\x5c\xd8\x7d\xf5\xcb\x12\x31\xdc\xa1\x9a\x12\xa1\x68\x69\x20\xd2\x29\x74\xa1\x8c\x48\xa7\xd8\x2d\x3b\x11\xc9\x05\x19\xd0\x09\x65\x17\x24\xc7\xdc\xcb\xe3\xde\xe5\x3d\xa2\x0f\xc5\xaa\xea\x90\x9c\x61\xba\x22\xc8\x16\xc8\x47\x7e\xbc\x6f\xa9\x46\xdf\xbc\x17\x01\xc8\x39\xe6\x05\xbf\xfc\x54\xf8\xc0\x1c\xcb\xb7\xff\x4d\xe5\x6e\x89\xd2\xc4\x9f\xdb\x62\x2e\x0b\xca\x22\x65\x10\x1f\x4a\xa0\x02\xc5\xdc\xef\xec\x5e\xe7\x51\x0a\x3d\x4e\x98\xa7\xfd\xa3\x18\xec\x53\x29\x7e\xce\x1f\x18\x43\xa7\x0f\xc6\x38\xad\x74\x22\xba\x33\x33\x50\x55\xd8\xbd\x87\x33\xfa\x13\xf0\x33\x11\x48\x52\x6c\x71\x71\x1f\x8b\x46\x18\x38\xa1\x22\xf0\xe1\x73\xb7\x92\x62\xb7\xc2\xad\x3f\x39\xd5\x31\x6f\xc4\x3e\xe9\x99\x7d\xd2\x3e\x6f\x50\x25\xcf\x34\xe8\x12\x92\xce\x4e\x17\x00\x69\x56\x4e\xe4\xac\x89\xf9\x0f\xcc\x33\xd2\x5c\x26\x6d\x1d\x70\x96\x99\x72\xc6\x84\x1c\x34\x0b\x7c\x65\x27\x67\x3e\x10\x43\xa4\x2c\xd5\xb5\x74\x87\x50\x75\x90\xdb\x57\xef\x45\x9c\x6c\x2e\xb4\xee\x24\xc1\x3e\x09\x00\xe5\xe4\x98\x1f\x97\x08\xa0\x35\x01\x93\x94\x79\x26\x3d\xaf\x23\x43\x4c\x90\x65\x66\xa0\x15\x62\x2d\xfb\x14\x2d\xca\x71\xb6\x82\x60\x01\x02\xf4\xa2\x41\xe6\x1e\x75\x5b\xbf\xd1\x87\x8c\x0e\xdf\xea\xfd\x3e\x31\xc2\x3c\x3f\x16\x12\x12\x06\xfa\x13\xe9\x87\x19\x43\xba\x29\x84\xad\x42\x3e\x9f\xcf\x3f\x3c\x85\xef\x1d\xf3\x01\x09\xb1\x37\x3c\x76\x0f\x12\xf2\xf4\x15\x97\x1c\x3c\x09\x22\xdc\x07\x00\xfa\x97\x58\x82\x8b\x24\xf1\x4c\xbe\xf5\x74\x43\x43\x82\x61\xb2\xb6\x17\x58\xae\xb9\xda\x0a\x05\xc7\x1a\x11\x81\x87\x10\xea\x3f\x57\x44\x3c\x2d\x04\x39\x00\x26\x37\x90\x03\xa6\xd6\x42\x10\x40\xdc\xb1\x3b\x7a\x75\x30\x82\x2d\x94\x94\x84\x18\x33\xcf\x72\xc8\x44\x11\xe2\x5b\x05\xb1\xff\xc3\xc9\x99\x86\x45\xd4\xfe\xb3\xed\xa8\x0e\xe9\xdd\xaa\x86\x46\x92\x87\x38\x04\xd9\xc4\x69\x50\x65\xf5\x51\x1d\x46\x51\xce\x93\xf1\xa6\x62\x88\x7e\xc9\x67\x32\x42\xcf\xa4\x42\xab\x43\x78\x10\x39\xd6\xc7\x05\xed\x23\x93\x11\x7b\x43\xa2\x5a\x41\x83\x04\x40\x8b\x45\x35\x85\xbb\x54\xa0\x02\x13\xf8\x88\xc4\xb8\xeb\xd0\xb4\x58\x05\x65\xff\xee\x28\x9d\x6d\x4b\xe4\x2f\x37\x0b\x54\x76\xb1\x11\x9e\x69\xb3\x35\x53\xf2\x3c\xfb\x6c\x39\xdc\xd3\xd3\xf4\x27\x30\xbb\x1a\x89\x05\xd0\x91\x1c\x2c\x00\xec\xa1\x7b\xd1\x98\xde\x9a\xea\xb4\xbe\xea\x87\xbf\x79\x00\x50\x0e\x28\xbd\xc8\x11\x1d\x32\xbc\x06\x70\x73\x5b\xd4\xcf\xd4\xfe\x58\x3f\xbb\x35\x0d\x32\xd6\xcf\xcc\x3e\xd8\xd6\xb8\xfa\x61\xa8\x8f\xba\xa6\x3a\xa6\x95\x1b\xd9\xc4\xc2\x1a\xa5\xaf\xe3\xb1\xdf\xd4\x15\xa5\x84\xb4\x91\x4c\xc6\x7f\xf5\x9d\xbd\x62\x3e\xb0\x63\x51\x9f\x3a\xb1\x0a\xb7\xd3\x16\x4b\xb2\x02\xdd\x54\xb3\xca\xb1\xed\xb8\xc5\xd3\xf9\x25\xc3\x1d\xad\x7a\xb7\xc8\x04\xe0\x09\xec\xc9\x6d\xd0\x31\xa0\x3a\xc3\x5c\x06\xd5\xc4\x21\x0e\xbb\xe2\x69\xe5\x4c\x83\x95\xf7\x57\x6e\x56\xf5\xa8\x95\x42\x8e\x5a\x4a\xc6\xe3\x65\xaa\xc4\x31\x66\xe5\xea\x51\x73\x63\x8a\x55\xcb\xae\x24\x01\x31\x93\xb6\xdb\xa2\x3e\xcd\x8c\x42\xca\x3f\x01\x92\x93\x46\x48\x02\x32\xad\xfb\x1c\x45\xf7\x38\xca\xa3\x18\x65\xd6\x4c\x7a\xcf\x0a\x9f\x29\x65\xfb\xf2\x79\x9b\x25\x02\x98\xf2\x09\xdc\x8c\xc1\x63\x3c\x26\xcc\x44\x33\x63\xc3\x65\x32\x4e\x6a\xb6\xb7\xe7\xc6\xe3\x78\x56\xb8\x13\xa0\x03\x26\xa2\x93\x60\xae\x36\x34\xe9\xe0\x63\x07\x10\x7a\x4e\xed\x9b\x0f\x5c\xd6\x56\xa7\x64\x8e\x69\xc4\xa4\xaf\x7c\x3e\xd8\xa3\xd4\x26\xcd\x89\xbc\x1c\xba\xb0\x88\x24\x8b\x84\xcf\x9b\xd5\x53\x85\x2a\x00\x1b\x02\xc4\xcc\x80\xcf\x33\xb0\x6f\xcc\xcf\xf9\x87\x97\x17\xa3\x1b\x36\x6d\x9e\x1b\x7f\x4b\xcb\x3d\x8c\x6e\x86\x7a\xaf\xd1\xe7\x25\x7e\x63\x4e\x30\xfe\xbb\xec\x6f\xc2\x6f\x2c\xca\xe9\xb3\xed\x90\xfb\x78\x19\xff\x1d\x2f\x43\xc7\x44\xd7\x86\xc4\x27\xb0\x1e\xa7\xcd\x73\x6f\xab\xb1\x28\x99\x31\x2f\xcd\xff\xbd\x4e\x80\x85\x3c\x0b\x9e\x69\x21\x79\x7e\x68\x73\x9b\x7b\x0a\x86\xde\x7f\xe6\x7b\x05\x8c\xd1\xe7\xf9\x05\x82\x17\x33\xee\xb7\xe7\xbb\xd4\x79\xee\x7a\xd7\x5c\x44\x0e\x1c\xee\x58\x78\x3e\xee\xe8\xa6\x11\x87\x47\xeb\x13\xad\xdc\xd0\xec\x71\x8b\x13\x73\x91\xf1\x1c\xfa\xd4\xde\x2d\x41\x2f\x93\x98\xe3\x9e\xe7\xa9\x77\xcd\x42\x42\xa1\x7c\x8a\x0b\x1c\x95\x36\x96\x89\x60\xeb\x3b\x3c\xdc\xaa\xb6\x8f\x87\x0d\x43\xa1\x7d\x26\x3d\x7e\xb5\xc8\x8b\x70\x64\x1d\xdc\x45\xfd\xc4\xc1\x7e\xec\xf8\x7c\x3c\xce\x03\xc8\x1a\xd8\x54\x44\x0c\x28\x0d\xf7\xd6\x2f\x77\xd1\x3e\x3b\x3b\x3d\xbf\xbc\xbe\xf8\xba\x7f\x5d\x3d\xc7\xdf\x1a\xcd\x7d\xbe\x72\x2c\x16\x43\xb4\xc1\xf0\x5c\x7f\x3c\x76\x59\x2b\xdc\xa2\x6d\x5f\xa8\xf7\xc4\x03\x5f\x62\x74\x6a\xdf\x0f\x65\x0c\x31\xbf\x47\x33\x10\x37\x53\x6b\xd1\x2e\xa7\x1c\xe7\x62\xdd\x33\xb5\x29\x7d\xee\x2c\xe0\xa7\xaf\x4b\x2d\xe9\xde\xd0\x67\x6e\x50\xb3\x80\x35\xf1\xc1\x35\x05\x05\xef\x38\x3f\x93\x99\x06\x21\x7d\x7f\xcd\x0c\x3d\x17\x73\xa0\x40\xe5\xbd\x84\x2b\xd9\x32\x38\xe2\xdf\xc8\x10\x31\xa8\x2c\x5c\x6b\x69\x36\x3a\x55\x62\xa0\x93\xd2\x16\x63\x3c\xf6\x57\x62\x73\xf6\x4a\xf0\x76\x9e\x6e\x2d\x3f\x56\xb5\xf4\xfe\x6b\x12\x80\xcd\xef\x76\x39\x98\xc5\x07\x36\xc3\xc7\xc0\x0b\x69\x6d\xb0\xfc\xef\x27\xc7\x07\x8e\xf3\x70\x4e\xfe\x1c\x11\xdb\x61\x01\x43\x16\xe8\x0c\xfa\x40\x2c\x21\x84\x8c\x88\xd0\x0f\xf4\x81\x58\xcc\xe7\x37\xe9\x5b\x5a\x6b\x64\x03\x4b\x14\xea\xaa\x3e\x24\xfd\x0d\xc7\xe4\xde\x6c\x1b\x6c\x96\x1b\x02\xe5\x76\x91\xb0\x2e\xc5\xdd\x0f\x20\x2b\x6c\xb8\xba\x73\xbb\xc1\xeb\x6e\x50\xc5\x7d\x43\xc8\x06\x6d\xb1\x3b\x71\xde\x6c\x13\x5e\x6a\x84\xa2\x5c\xed\x91\x18\xce\xb1\x6e\x3b\xc4\x20\x96\xc8\x68\x91\x00\xa7\x5c\xd5\x88\xef\xaa\xc6\xe2\x89\xd2\x3d\x0a\xd3\x6a\x33\xaf\x09\x01\xa6\xac\x99\x15\xa9\x17\x77\x73\xa3\xb0\xb0\x1f\x4c\xc3\x66\x37\xaf\xc3\x27\x76\x84\x2a\xdc\x0c\xcd\x1b\x61\xc6\x6a\x47\xcc\xbc\x29\xb9\x65\x23\xe7\xf0\x5f\x48\x86\x74\x5d\xfc\xa7\x69\xf1\xd0\x62\xb2\xe0\xc4\xe0\x32\xa0\xb0\x5f\xbb\x14\xf8\x16\x84\x46\xce\x26\x46\x7f\xae\x6b\xe0\x42\x0a\x11\xc3\xab\x00\x37\x29\xa0\xb9\x73\xda\x6c\xec\xf4\xd4\xee\x08\xff\xc8\x66\x41\x0a\xba\x92\xee\x94\xc6\x80\x19\x87\xf6\xfa\x9a\xde\xe1\x69\x7d\x7a\xed\x06\x57\x10\xd3\xc7\xed\x53\xa9\x59\x61\x85\xbd\xcf\x5c\xd0\x7d\xc5\x37\xca\xb2\xde\x94\x09\xbd\x95\x75\x42\xb7\x94\x3a\xdb\x5d\xc7\x10\x55\x30\x81\x38\x93\xd9\xa4\x9a\x9b\x9a\xeb\x59\xa6\x6d\x73\xfa\x84\x04\xd5\x30\x8d\xe7\x7b\x73\x64\x0b\x00\xaa\x81\x47\x8f\x0c\x55\xee\xd1\x03\x19\xcd\x56\x73\xbe\x2e\x9e\xc9\xd8\xc4\xf1\x16\x2e\xaa\x41\xf0\x3e\x76\xf3\x79\x00\xad\x39\x58\xc8\x54\xae\x34\x2c\x4c\x6f\x35\xf8\x4e\x0a\xb3\x66\xd8\x4c\xb7\x4f\xa7\x43\x6d\x91\x80\x4c\x66\x53\x11\x09\xa8\x4c\xf3\x12\x19\x5f\xd4\x3e\x94\x7c\x8e\x2c\xfa\xba\x39\x8b\x97\x4f\xf1\x17\x87\x2c\x24\x42\xbc\xe7\xac\x7e\x42\xce\xc1\x20\x60\x6c\xec\x45\xd0\x5c\x50\x64\x3e\x6d\xcd\x5d\x0f\x75\xe3\x6e\x3c\x16\xc3\x07\x14\x95\xb2\x72\xb3\x0e\xda\x54\x01\x84\x56\x4c\x7e\x36\xe7\xfb\x23\x23\x9e\x40\x4f\x34\xed\x99\xc3\x2c\xc9\xdd\x9a\xb6\x43\xf5\x8d\x2c\xd5\xab\x2d\x27\x12\x24\x57\xed\x3f\x4f\x8d\xd1\x27\x6b\x4c\x0e\x24\xc8\x93\x94\xef\xc8\xb3\x2d\x86\xd0\x67\xc6\xe8\x59\xee\xd6\x38\xd8\x7a\x33\x7d\xa3\xf9\xc5\xb1\x88\x8e\x19\x75\x5e\x76\xe6\xfb\x1a\xf7\x3c\x97\xea\xb4\xc0\xb7\xba\xe7\x67\x91\xd4\x46\xe6\x7c\x25\x28\x21\xf1\x5e\xd3\x99\x06\xf2\xae\x6f\x3e\xb0\x91\x93\x22\x9c\x6a\xc4\x59\xb4\xc4\xb4\x35\x1e\xf1\xf4\x74\x20\x62\x7f\xba\x5b\x05\x1e\x49\x6c\x34\x1c\x4a\x89\x8e\x3a\xa4\x1b\xba\x01\x0c\x7d\xa3\x3b\xdb\x36\x3f\xb7\xed\x47\xed\x67\xf6\xe9\x7e\xe8\x05\x6e\x8c\x66\xe5\x7e\x2f\x73\x73\x36\xe4\xa1\x1a\x13\x99\x2c\x5a\x63\x0a\x40\xbd\xd8\x69\x38\x71\x98\x1c\xe4\x8f\xc2\x7c\x2d\x25\x9f\xf3\x20\xee\x6c\xc1\x78\xaf\x98\x87\x25\x10\x3f\xd2\x0c\xca\xda\x8f\x5a\xac\xe8\xd6\x0e\x88\xdf\x63\x1c\x8f\x87\x61\x77\xfd\xf4\xe0\xb6\xcb\xc8\x1e\x9c\x3e\x1a\xf3\x7c\x19\x0d\x30\x61\x8c\x8f\x53\x3e\x8b\x32\x33\xab\x87\x30\xa7\x7c\xc6\x42\xca\xc7\x1b\x60\x94\x6f\x66\x99\x18\x03\x85\x04\xac\xff\x16\x2a\x24\xbe\x67\x17\x3f\x64\x27\xa9\xae\x45\x88\x44\xfd\x86\x10\x99\xf6\x06\x43\x24\x77\x79\x7a\x54\x6b\xf2\x70\x94\x64\xe6\x31\xe6\xaf\xab\x97\xff\x65\x57\x2f\x1d\xb1\x50\xe2\x86\x88\x3d\x00\xd5\x79\x2b\xfb\xc2\x4e\xa8\xf3\x90\x1f\xb2\x17\x26\xd0\x8e\x23\xc5\xcb\xc5\xe5\x79\xa3\xb9\x2f\xe5\x21\xbe\xbc\x3c\x6f\xc8\xed\xcb\x9a\x54\x80\xed\xf3\x63\xa9\x08\x95\xd3\x76\xf3\xb2\x76\x2e\xed\xf8\xbf\x2e\xa4\x12\x3c\x3d\xab\x35\x5b\xed\xd3\xcb\x9a\xb4\x0b\x95\xe3\xd3\x8b\x1a\x7f\xf8\x30\x81\x66\x10\x19\x33\x86\x83\xd3\x97\x11\xf1\x78\xbc\x89\x73\xbd\x48\xa1\xf1\x98\x3b\x34\x30\x2a\x12\xcd\x00\xfe\x95\x9b\x72\x68\x4d\x62\x2e\x47\xf1\x62\x5e\x90\xa2\xed\x9f\xf6\xef\xf0\xa7\xfd\xfb\x36\x8b\x48\xe4\xbb\x29\xa8\x28\x5f\x56\x3f\xcb\x65\xd5\x37\x3c\xd9\xc8\xe8\xa8\xdd\xb0\x4e\x76\x1b\x40\x13\x59\xa2\x0d\x8b\x00\xea\xc8\xec\xe4\xbb\xb0\x87\x4c\x16\xc1\x9f\xe3\x8f\x0e\xbc\x10\x05\xc4\xef\xd6\xee\xe8\xdd\xf2\x70\x3c\x16\x13\xef\x50\xa7\x0b\xe0\x90\xd7\x62\xb0\x68\x18\x8e\xd8\x1b\x8f\xf3\xb0\x90\x07\x20\xc4\x0c\x18\xdf\xbc\x71\x20\x85\x73\xc5\xe1\x87\xa6\xf2\x65\xeb\xb3\x53\xb6\xb2\x59\x10\xe9\x10\x77\xac\x6e\x97\xb6\x24\x52\x52\x94\x4e\x26\x92\xa4\x89\x5d\xf0\x1f\x8f\x37\x89\x7f\x74\x11\x81\x7e\xf4\xdd\x94\x0b\x4a\x22\x3f\xac\xe3\xbb\xa0\x44\x64\x00\x4f\x10\x36\xc5\xa0\x46\x6c\x4d\x74\xba\x8a\x23\x24\x08\xb0\x15\xc2\xaf\x61\xf4\x2c\x26\x0a\x51\x2a\xd2\x8a\x38\xb9\xb4\xf8\xba\xb9\xa8\x15\x5f\xb4\x36\xb2\x44\x97\x2e\x9a\x86\xda\x74\xd1\x14\xd4\xee\x14\xba\xb0\xcf\x3c\x65\x3c\x08\x69\xdd\x72\x3f\x93\x11\xfb\x9d\x7e\x10\xc6\xb3\x9b\x45\x41\x88\x3b\xa5\x52\x90\x82\x75\x52\xf8\x22\xf9\xe0\xaf\xa3\x7c\xb9\xfe\x59\x2e\xd7\x7d\xc4\xa9\x21\xa3\x53\x0f\xfc\x5b\x6a\xf1\xaf\xa3\x78\x1b\x69\x94\x45\x35\x4e\x6d\xc6\x63\x41\x88\x7f\xef\x24\xdc\x62\x78\xc6\x89\x40\x26\xe3\x55\xce\x64\xc4\x51\x96\x3b\x31\x85\x27\x8d\x5e\x1e\x60\x81\x38\xe2\x4d\xfb\x7b\x95\x0e\x73\x10\x9d\x7f\x8d\x99\xa4\x69\x8d\x6e\x79\xc0\x5b\x1d\x8a\x9d\x41\x67\x10\x82\xa3\x0b\x05\x01\xd6\x7c\x07\xb6\xf4\x86\x2f\x58\xcb\xb7\xb3\x5a\xbe\xf5\x5b\xbe\x85\xb5\x9c\x36\x1c\x91\x99\xed\x85\xf4\x63\x94\x45\x54\xe4\xdb\xcc\x43\x27\x17\x5e\xbb\x05\xb1\xa7\x6c\x36\x31\x9a\x90\xe2\x44\x8b\x6d\x6d\x41\xbf\xb5\x42\xbc\xb5\x78\x75\x4a\xd7\x46\x99\x8c\xa8\x7b\xc1\x5a\xe9\x02\x4a\x2a\xf3\xe2\xf1\xe4\xbd\xd1\x04\x30\xbc\x04\x30\x51\x86\x11\x50\xaf\x50\x64\x81\x27\xa1\x49\x79\x94\xc9\xcc\x6f\x57\x9f\x24\x19\xfb\x14\x6d\x24\x99\x0c\xd5\x80\x40\x10\x3f\x03\x27\x28\x9f\x15\x92\x04\x8f\x4f\x6e\x16\xa0\x4a\xff\x98\x74\x37\xf5\xe8\x9f\x21\xdf\x5c\xf9\xf2\xe8\xb3\x55\x1e\xf9\xc8\xdb\x62\x1f\x7c\x50\x2d\xec\x88\xa3\x20\xe6\x44\xcb\xf3\x7d\xfd\x8d\x7b\xb2\xfe\x26\xfc\x26\xc9\x15\x33\x8b\x5a\x92\x68\xa0\x4d\x03\xaa\xe3\xb1\x41\x35\x99\xe8\xbc\x7c\x54\xf7\x66\x66\x4e\x00\xeb\x3b\x1e\x36\xe9\xe7\x4f\x41\x92\x2b\x22\x6d\x8a\x8d\x11\x48\x32\xda\xcc\x47\x4b\x88\x82\x64\x78\x5d\xa9\x94\xe7\xf6\x90\xc9\xe7\x40\x87\x1f\x6b\x0b\xb0\xa0\x4b\x06\xa0\x85\x83\x70\x47\x6a\x10\x03\xd1\xcc\x64\x86\xfe\xd7\x14\x60\xcf\x9b\x90\xea\x38\x96\x20\x0d\x23\x27\xd0\x89\x39\x04\x7b\xd1\x9b\xc6\xb0\x93\xef\x4e\xe2\xc1\xc2\x38\xa2\xb3\xce\xc3\x86\x7c\x52\xe4\xb7\xe3\xed\x0f\x48\xf7\x02\x6f\xa4\x3c\x8c\xde\x24\x76\xbd\x7d\x80\x86\x9d\x42\x97\x22\x37\x1b\x85\x1b\x8b\xa1\xe5\x6f\xa9\xd4\xae\xda\xc9\xae\x2e\x66\xf6\xd5\x66\x5b\xcf\xeb\x29\xc8\x29\xb2\x9c\x60\x14\xc5\x70\x14\xed\xd8\x28\x46\xd6\x70\x2e\xc4\xda\xe7\xc7\x31\x58\x4d\x02\xb4\x8b\xb6\x02\x83\x65\x55\x33\x19\x31\x5c\x18\x86\x22\x51\xf0\x6e\x78\xce\xd3\x3f\x9d\xa0\x86\x49\xb7\xa6\xe8\xc0\x44\x71\xff\x3c\x85\x96\x99\x50\xcc\xa2\x2c\x21\x93\x11\x19\x5e\xf9\xbb\xcf\xcc\x64\xbc\xaa\xec\x2c\xae\x83\xbb\xc8\x01\xd0\xa1\xdb\x2e\x3d\x74\xa6\xef\xf6\x6d\x3e\x10\x63\x8b\x51\x0c\x41\xc2\xf1\x19\x07\xb4\x6a\x32\x1d\x45\x6e\x46\x95\x90\x40\x31\xb5\xa0\x37\x23\x46\x2f\xe6\x34\xca\xae\xf8\x3f\x62\x8c\x4d\xea\x08\xbf\xfd\x14\x7e\x13\x20\x4f\xa8\xbc\x53\xfc\x3d\xf4\xe7\xf8\x12\xb8\x60\xb2\x78\x42\xfe\xc3\x56\x11\x40\x32\x1e\x67\xb3\x06\xb4\x3a\x46\xd7\x3f\x16\x15\xb7\xff\xdd\x11\x7e\xeb\x8e\xe9\x9f\xff\xd9\xd6\x20\xd3\x5a\x86\x68\x76\x68\x6e\x1c\x0a\x4e\x82\xe0\x39\x79\x5a\xcc\xc9\xd3\xa6\x58\x21\xaa\x59\xc4\x48\x1f\x80\x6a\x96\xc7\x66\xe6\x76\x0c\x4f\x98\xb9\x24\x4f\x0e\x10\x71\xc7\xee\x46\x9c\x9f\x8e\x75\xdb\x61\x0e\xa5\x54\x02\x06\x22\x15\x1f\xfa\xa4\xa7\xdf\xab\x43\x01\xc0\xc8\x25\x27\x95\xea\xc8\x13\x50\xfe\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), + modTime: time.Date(2022, 10, 16, 17, 51, 16, 603109078, 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"), + compressedContent: []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x02\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{ @@ -146,7 +145,7 @@ func (f *vfsgen۰CompressedFile) Read(p []byte) (n int, err error) { } if f.grPos < f.seekPos { // Fast-forward. - _, err = io.CopyN(ioutil.Discard, f.gr, f.seekPos-f.grPos) + _, err = io.CopyN(io.Discard, f.gr, f.seekPos-f.grPos) if err != nil { return 0, err } diff --git a/vendor/github.com/tsenart/vegeta/v12/lib/plot/plot.go b/vendor/github.com/tsenart/vegeta/v12/lib/plot/plot.go index a4abafb480dc..0a9e7d9a518c 100644 --- a/vendor/github.com/tsenart/vegeta/v12/lib/plot/plot.go +++ b/vendor/github.com/tsenart/vegeta/v12/lib/plot/plot.go @@ -7,7 +7,6 @@ import ( "fmt" "html/template" "io" - "io/ioutil" "math" "sort" "strconv" @@ -167,7 +166,7 @@ func (p *Plot) Close() { } // WriteTo writes the HTML plot to the give io.Writer. -func (p Plot) WriteTo(w io.Writer) (n int64, err error) { +func (p *Plot) WriteTo(w io.Writer) (n int64, err error) { type dygraphsOpts struct { Title string `json:"title"` Labels []string `json:"labels,omitempty"` @@ -241,7 +240,7 @@ func (p Plot) WriteTo(w io.Writer) (n int64, err error) { } var ( - reds = []string{ + failures = []string{ "#EE7860", "#DD624E", "#CA4E3E", @@ -250,29 +249,29 @@ var ( "#881618", "#6F050E", } - greens = []string{ - "#A6DA83", - "#84C068", - "#64A550", - "#488A3A", - "#2F7027", - "#185717", - "#053E0A", + successes = []string{ + "#E9D758", + "#297373", + "#39393A", + "#A1CDF4", + "#593C8F", + "#171738", + "#A1674A", } ) func labelColors(labels []string) []string { colors := make([]string, 0, len(labels)) - var red, green int + var failure, success int for _, label := range labels { var color string if strings.Contains(label, "ERROR") { - color = reds[red%len(reds)] - red++ + color = failures[failure%len(failures)] + failure++ } else { - color = greens[green%len(greens)] - green++ + color = successes[success%len(successes)] + success++ } colors = append(colors, color) } @@ -338,7 +337,7 @@ func asset(path string) ([]byte, error) { if err != nil { return nil, err } - return ioutil.ReadAll(file) + return io.ReadAll(file) } type countingWriter struct { diff --git a/vendor/github.com/tsenart/vegeta/v12/lib/prom/grafana.json b/vendor/github.com/tsenart/vegeta/v12/lib/prom/grafana.json new file mode 100644 index 000000000000..331edc5a40e5 --- /dev/null +++ b/vendor/github.com/tsenart/vegeta/v12/lib/prom/grafana.json @@ -0,0 +1,645 @@ +{ + "__inputs": [ + { + "name": "DS_PROMETHEUS", + "label": "prometheus", + "description": "", + "type": "datasource", + "pluginId": "prometheus", + "pluginName": "Prometheus" + } + ], + "__requires": [ + { + "type": "grafana", + "id": "grafana", + "name": "Grafana", + "version": "5.2.4" + }, + { + "type": "panel", + "id": "graph", + "name": "Graph", + "version": "5.0.0" + }, + { + "type": "datasource", + "id": "prometheus", + "name": "Prometheus", + "version": "5.0.0" + } + ], + "annotations": { + "list": [ + { + "builtIn": 1, + "datasource": "-- Grafana --", + "enable": true, + "hide": true, + "iconColor": "rgba(0, 211, 255, 1)", + "name": "Annotations & Alerts", + "type": "dashboard" + } + ] + }, + "editable": true, + "gnetId": null, + "graphTooltip": 0, + "id": null, + "links": [], + "panels": [ + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "${DS_PROMETHEUS}", + "fill": 1, + "gridPos": { + "h": 4, + "w": 12, + "x": 0, + "y": 0 + }, + "id": 12, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "links": [], + "nullPointMode": "null", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "rate(request_seconds_count{status=~\"2..\"}[1m])/rate(request_seconds_count[1m])", + "format": "time_series", + "intervalFactor": 1, + "legendFormat": "status {{status}} {{url}}", + "refId": "A" + }, + { + "expr": "rate(request_seconds_count{status=~\"3..\"}[1m])/rate(request_seconds_count[1m])", + "format": "time_series", + "intervalFactor": 1, + "legendFormat": "status {{status}} {{url}}", + "refId": "B" + }, + { + "expr": "rate(request_seconds_count{status=~\"4..\"}[1m])/rate(request_seconds_count[1m])", + "format": "time_series", + "intervalFactor": 1, + "legendFormat": "status {{status}} {{url}}", + "refId": "C" + }, + { + "expr": "rate(request_seconds_count{status=~\"5..\"}[1m])/rate(request_seconds_count[1m])", + "format": "time_series", + "intervalFactor": 1, + "legendFormat": "status {{status}} {{url}}", + "refId": "D" + } + ], + "thresholds": [], + "timeFrom": null, + "timeShift": null, + "title": "Request Status", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "percentunit", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "${DS_PROMETHEUS}", + "fill": 1, + "gridPos": { + "h": 4, + "w": 12, + "x": 12, + "y": 0 + }, + "id": 6, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "links": [], + "nullPointMode": "null", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "histogram_quantile(0.50, sum(rate(request_seconds_bucket[1m])) by (le, status))", + "format": "time_series", + "intervalFactor": 1, + "legendFormat": "P50 {{status}}", + "refId": "A" + }, + { + "expr": "histogram_quantile(0.90, sum(rate(request_seconds_bucket[1m])) by (le, status))", + "format": "time_series", + "intervalFactor": 1, + "legendFormat": "P90 {{status}}", + "refId": "B" + }, + { + "expr": "histogram_quantile(0.99, sum(rate(request_seconds_bucket[1m])) by (le, status))", + "format": "time_series", + "intervalFactor": 1, + "legendFormat": "P99 {{status}}", + "refId": "C" + } + ], + "thresholds": [], + "timeFrom": null, + "timeShift": null, + "title": "Average Request Latency", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "s", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "${DS_PROMETHEUS}", + "fill": 1, + "gridPos": { + "h": 5, + "w": 12, + "x": 0, + "y": 4 + }, + "id": 4, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "links": [], + "nullPointMode": "null", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "rate(request_seconds_count[1m])", + "format": "time_series", + "intervalFactor": 1, + "legendFormat": "throughtput {{url}} {{status}}", + "refId": "A" + } + ], + "thresholds": [], + "timeFrom": null, + "timeShift": null, + "title": "Requests per second", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "reqps", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "${DS_PROMETHEUS}", + "fill": 1, + "gridPos": { + "h": 5, + "w": 12, + "x": 12, + "y": 4 + }, + "id": 8, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "links": [], + "nullPointMode": "null", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "go_threads{job=\"vegeta\"} ", + "format": "time_series", + "hide": false, + "intervalFactor": 1, + "legendFormat": "Vegeta Go threads", + "refId": "A" + }, + { + "expr": "go_goroutines{job=\"vegeta\"} ", + "format": "time_series", + "intervalFactor": 1, + "legendFormat": "Vegeta Go routines", + "refId": "B" + } + ], + "thresholds": [], + "timeFrom": null, + "timeShift": null, + "title": "Vegeta threads", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "${DS_PROMETHEUS}", + "fill": 1, + "gridPos": { + "h": 5, + "w": 12, + "x": 0, + "y": 9 + }, + "id": 2, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "links": [], + "nullPointMode": "null", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "rate(request_bytes_in[1m])", + "format": "time_series", + "intervalFactor": 1, + "legendFormat": "bytes_out {{url}} {{status}}", + "refId": "A" + }, + { + "expr": "rate(request_bytes_out[1m])", + "format": "time_series", + "intervalFactor": 1, + "legendFormat": "bytes_out {{url}} {{status}}", + "refId": "B" + } + ], + "thresholds": [], + "timeFrom": null, + "timeShift": null, + "title": "Data throughput", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "Bps", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "${DS_PROMETHEUS}", + "fill": 1, + "gridPos": { + "h": 5, + "w": 12, + "x": 12, + "y": 9 + }, + "id": 10, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "links": [], + "nullPointMode": "null", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "go_memstats_alloc_bytes{job=\"vegeta\"}", + "format": "time_series", + "intervalFactor": 1, + "refId": "A" + } + ], + "thresholds": [], + "timeFrom": null, + "timeShift": null, + "title": "Vegeta Heap Size", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "decbytes", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + } + ], + "refresh": false, + "schemaVersion": 16, + "style": "dark", + "tags": [], + "templating": { + "list": [] + }, + "time": { + "from": "2023-07-23T13:28:35.330Z", + "to": "2023-07-23T13:33:18.000Z" + }, + "timepicker": { + "refresh_intervals": [ + "5s", + "10s", + "30s", + "1m", + "5m", + "15m", + "30m", + "1h", + "2h", + "1d" + ], + "time_options": [ + "5m", + "15m", + "1h", + "6h", + "12h", + "24h", + "2d", + "7d", + "30d" + ] + }, + "timezone": "", + "title": "Vegeta", + "uid": "6GNY5DGGk", + "version": 3 +} \ No newline at end of file diff --git a/vendor/github.com/tsenart/vegeta/v12/lib/prom/prom.go b/vendor/github.com/tsenart/vegeta/v12/lib/prom/prom.go new file mode 100644 index 000000000000..fb885f685e5e --- /dev/null +++ b/vendor/github.com/tsenart/vegeta/v12/lib/prom/prom.go @@ -0,0 +1,82 @@ +package prom + +import ( + "fmt" + "net/http" + "strconv" + "time" + + "github.com/prometheus/client_golang/prometheus" + "github.com/prometheus/client_golang/prometheus/promhttp" + + vegeta "github.com/tsenart/vegeta/v12/lib" +) + +// Metrics encapsulates Prometheus metrics of an attack. +type Metrics struct { + requestLatencyHistogram *prometheus.HistogramVec + requestBytesInCounter *prometheus.CounterVec + requestBytesOutCounter *prometheus.CounterVec + requestFailCounter *prometheus.CounterVec +} + +// NewMetrics returns a new Metrics instance that must be +// registered in a Prometheus registry with Register. +func NewMetrics() *Metrics { + baseLabels := []string{"method", "url", "status"} + return &Metrics{ + requestLatencyHistogram: prometheus.NewHistogramVec(prometheus.HistogramOpts{ + Name: "request_seconds", + Help: "Request latency", + Buckets: prometheus.DefBuckets, + }, baseLabels), + requestBytesInCounter: prometheus.NewCounterVec(prometheus.CounterOpts{ + Name: "request_bytes_in", + Help: "Bytes received from servers as response to requests", + }, baseLabels), + requestBytesOutCounter: prometheus.NewCounterVec(prometheus.CounterOpts{ + Name: "request_bytes_out", + Help: "Bytes sent to servers during requests", + }, baseLabels), + requestFailCounter: prometheus.NewCounterVec(prometheus.CounterOpts{ + Name: "request_fail_count", + Help: "Count of failed requests", + }, append(baseLabels[:len(baseLabels):len(baseLabels)], "message")), + } +} + +// Register registers all Prometheus metrics in r. +func (pm *Metrics) Register(r prometheus.Registerer) error { + for _, c := range []prometheus.Collector{ + pm.requestLatencyHistogram, + pm.requestBytesInCounter, + pm.requestBytesOutCounter, + pm.requestFailCounter, + } { + if err := r.Register(c); err != nil { + return fmt.Errorf("failed to register metric %v: %w", c, err) + } + } + return nil +} + +// Observe metrics given a vegeta.Result. +func (pm *Metrics) Observe(res *vegeta.Result) { + code := strconv.FormatUint(uint64(res.Code), 10) + pm.requestBytesInCounter.WithLabelValues(res.Method, res.URL, code).Add(float64(res.BytesIn)) + pm.requestBytesOutCounter.WithLabelValues(res.Method, res.URL, code).Add(float64(res.BytesOut)) + pm.requestLatencyHistogram.WithLabelValues(res.Method, res.URL, code).Observe(res.Latency.Seconds()) + if res.Error != "" { + pm.requestFailCounter.WithLabelValues(res.Method, res.URL, code, res.Error) + } +} + +// NewHandler returns a new http.Handler that exposes Prometheus +// metrics registed in r in the OpenMetrics format. +func NewHandler(r *prometheus.Registry, startTime time.Time) http.Handler { + return promhttp.HandlerFor(r, promhttp.HandlerOpts{ + Registry: r, + EnableOpenMetrics: true, + ProcessStartTime: startTime, + }) +} diff --git a/vendor/github.com/tsenart/vegeta/v12/lib/prom/prometheus-sample.png b/vendor/github.com/tsenart/vegeta/v12/lib/prom/prometheus-sample.png new file mode 100644 index 000000000000..d4e834a018a8 Binary files /dev/null and b/vendor/github.com/tsenart/vegeta/v12/lib/prom/prometheus-sample.png differ diff --git a/vendor/github.com/tsenart/vegeta/v12/lib/results_easyjson.go b/vendor/github.com/tsenart/vegeta/v12/lib/results_easyjson.go index 3beb22f7d839..844e3b95e902 100644 --- a/vendor/github.com/tsenart/vegeta/v12/lib/results_easyjson.go +++ b/vendor/github.com/tsenart/vegeta/v12/lib/results_easyjson.go @@ -4,11 +4,12 @@ package vegeta import ( json "encoding/json" + http "net/http" + time "time" + easyjson "github.com/mailru/easyjson" jlexer "github.com/mailru/easyjson/jlexer" jwriter "github.com/mailru/easyjson/jwriter" - http "net/http" - time "time" ) // suppress unused package warning @@ -30,7 +31,7 @@ func easyjsonBd1621b8DecodeGithubComTsenartVegetaV12Lib(in *jlexer.Lexer, out *j } in.Delim('{') for !in.IsDelim('}') { - key := in.UnsafeString() + key := in.UnsafeFieldName(false) in.WantColon() if in.IsNull() { in.Skip() @@ -72,11 +73,7 @@ func easyjsonBd1621b8DecodeGithubComTsenartVegetaV12Lib(in *jlexer.Lexer, out *j in.Skip() } else { in.Delim('{') - if !in.IsDelim('}') { - out.Headers = make(http.Header) - } else { - out.Headers = nil - } + out.Headers = make(http.Header) for !in.IsDelim('}') { key := string(in.String()) in.WantColon() diff --git a/vendor/github.com/tsenart/vegeta/v12/lib/results_fuzz.go b/vendor/github.com/tsenart/vegeta/v12/lib/results_fuzz.go index fced203da4a9..8c392e1831eb 100644 --- a/vendor/github.com/tsenart/vegeta/v12/lib/results_fuzz.go +++ b/vendor/github.com/tsenart/vegeta/v12/lib/results_fuzz.go @@ -1,3 +1,4 @@ +//go:build gofuzz // +build gofuzz package vegeta diff --git a/vendor/github.com/tsenart/vegeta/v12/lib/target.schema.json b/vendor/github.com/tsenart/vegeta/v12/lib/target.schema.json index 00286725295b..525282dffabd 100644 --- a/vendor/github.com/tsenart/vegeta/v12/lib/target.schema.json +++ b/vendor/github.com/tsenart/vegeta/v12/lib/target.schema.json @@ -8,6 +8,12 @@ "url" ], "properties": { + "method": { + "type": "string" + }, + "url": { + "type": "string" + }, "body": { "type": "string", "media": { @@ -24,12 +30,6 @@ } }, "type": "object" - }, - "method": { - "type": "string" - }, - "url": { - "type": "string" } }, "additionalProperties": false, diff --git a/vendor/github.com/tsenart/vegeta/v12/lib/targets.go b/vendor/github.com/tsenart/vegeta/v12/lib/targets.go index 2cb5dc2cfb5a..fee3f383bbdf 100644 --- a/vendor/github.com/tsenart/vegeta/v12/lib/targets.go +++ b/vendor/github.com/tsenart/vegeta/v12/lib/targets.go @@ -6,9 +6,9 @@ import ( "errors" "fmt" "io" - "io/ioutil" "net/http" "net/url" + "os" "regexp" "strings" "sync" @@ -31,17 +31,25 @@ type Target struct { // 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)) + var body io.Reader + if len(t.Body) != 0 { + body = bytes.NewReader(t.Body) + } + + req, err := http.NewRequest(t.Method, t.URL, 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 } @@ -116,12 +124,11 @@ func (tr Targeter) Decode(t *Target) error { // 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"} +// {"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. +// body will be set as the Target's body if no body is provided in each target definition. // 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 @@ -193,7 +200,7 @@ func (enc TargetEncoder) Encode(t *Target) error { return enc(t) } -// NewJSONTargetEncoder returns a TargetEncoder that encods Targets in the JSON format. +// NewJSONTargetEncoder returns a TargetEncoder that encodes Targets in the JSON format. func NewJSONTargetEncoder(w io.Writer) TargetEncoder { var jw jwriter.Writer return func(t *Target) error { @@ -242,13 +249,13 @@ func ReadAllTargets(t Targeter) (tgts []Target, err error) { // 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 +// 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 +// 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. @@ -303,7 +310,7 @@ func NewHTTPTargeter(src io.Reader, body []byte, hdr http.Header) Targeter { } else if strings.HasPrefix(line, "#") { continue } else if strings.HasPrefix(line, "@") { - if tgt.Body, err = ioutil.ReadFile(line[1:]); err != nil { + if tgt.Body, err = os.ReadFile(line[1:]); err != nil { return fmt.Errorf("bad body: %s", err) } break diff --git a/vendor/github.com/tsenart/vegeta/v12/lib/targets_fuzz.go b/vendor/github.com/tsenart/vegeta/v12/lib/targets_fuzz.go index 87a925fe1b20..37ffae8d8873 100644 --- a/vendor/github.com/tsenart/vegeta/v12/lib/targets_fuzz.go +++ b/vendor/github.com/tsenart/vegeta/v12/lib/targets_fuzz.go @@ -1,3 +1,4 @@ +//go:build gofuzz // +build gofuzz package vegeta diff --git a/vendor/github.com/tsenart/vegeta/v12/lib/util_fuzz.go b/vendor/github.com/tsenart/vegeta/v12/lib/util_fuzz.go index 60c758feac1a..780a28d217d7 100644 --- a/vendor/github.com/tsenart/vegeta/v12/lib/util_fuzz.go +++ b/vendor/github.com/tsenart/vegeta/v12/lib/util_fuzz.go @@ -1,3 +1,4 @@ +//go:build gofuzz // +build gofuzz package vegeta diff --git a/vendor/github.com/tsenart/vegeta/v12/main.go b/vendor/github.com/tsenart/vegeta/v12/main.go index 816505396096..a10c927f6255 100644 --- a/vendor/github.com/tsenart/vegeta/v12/main.go +++ b/vendor/github.com/tsenart/vegeta/v12/main.go @@ -44,7 +44,7 @@ func main() { } } - fmt.Fprintln(fs.Output(), examples) + fmt.Fprintf(fs.Output(), "%s\n", examples) } fs.Parse(os.Args[1:]) diff --git a/vendor/github.com/tsenart/vegeta/v12/plot.go b/vendor/github.com/tsenart/vegeta/v12/plot.go index 4325d9edf9f6..e9731ff87d00 100644 --- a/vendor/github.com/tsenart/vegeta/v12/plot.go +++ b/vendor/github.com/tsenart/vegeta/v12/plot.go @@ -47,7 +47,7 @@ func plotCmd() command { output := fs.String("output", "stdout", "Output file") fs.Usage = func() { - fmt.Fprintln(os.Stderr, plotUsage) + fmt.Fprintf(os.Stderr, "%s\n", plotUsage) } return command{fs, func(args []string) error { diff --git a/vendor/github.com/tsenart/vegeta/v12/report.go b/vendor/github.com/tsenart/vegeta/v12/report.go index 94074b7f30b9..bab02c7f71c8 100644 --- a/vendor/github.com/tsenart/vegeta/v12/report.go +++ b/vendor/github.com/tsenart/vegeta/v12/report.go @@ -33,6 +33,7 @@ Options: 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.gob | rg -vU 'Error Set:.*' # Don't show errors vegeta report results.* ` @@ -44,7 +45,7 @@ func reportCmd() command { buckets := fs.String("buckets", "", "Histogram buckets, e.g.: \"[0,1ms,10ms]\"") fs.Usage = func() { - fmt.Fprintln(os.Stderr, reportUsage) + fmt.Fprintf(os.Stderr, "%s\n", reportUsage) } return command{fs, func(args []string) error { diff --git a/vendor/github.com/tsenart/vegeta/v12/report_nonwindows.go b/vendor/github.com/tsenart/vegeta/v12/report_nonwindows.go index 48e8ceb10fb2..bcc5d1ffa759 100644 --- a/vendor/github.com/tsenart/vegeta/v12/report_nonwindows.go +++ b/vendor/github.com/tsenart/vegeta/v12/report_nonwindows.go @@ -1,3 +1,4 @@ +//go:build !windows // +build !windows package main diff --git a/vendor/github.com/tsenart/vegeta/v12/report_windows.go b/vendor/github.com/tsenart/vegeta/v12/report_windows.go index cf1db6d70501..c52de265a07c 100644 --- a/vendor/github.com/tsenart/vegeta/v12/report_windows.go +++ b/vendor/github.com/tsenart/vegeta/v12/report_windows.go @@ -1,3 +1,4 @@ +//go:build windows // +build windows package main diff --git a/vendor/go.uber.org/zap/.readme.tmpl b/vendor/go.uber.org/zap/.readme.tmpl index 3154a1e64cf2..92aa65d660b6 100644 --- a/vendor/go.uber.org/zap/.readme.tmpl +++ b/vendor/go.uber.org/zap/.readme.tmpl @@ -96,14 +96,14 @@ Released under the [MIT License](LICENSE.txt). 1 In particular, keep in mind that we may be benchmarking against slightly older versions of other packages. Versions are -pinned in zap's [glide.lock][] file. [↩](#anchor-versions) +pinned in the [benchmarks/go.mod][] file. [↩](#anchor-versions) -[doc-img]: https://godoc.org/go.uber.org/zap?status.svg -[doc]: https://godoc.org/go.uber.org/zap -[ci-img]: https://travis-ci.com/uber-go/zap.svg?branch=master -[ci]: https://travis-ci.com/uber-go/zap +[doc-img]: https://pkg.go.dev/badge/go.uber.org/zap +[doc]: https://pkg.go.dev/go.uber.org/zap +[ci-img]: https://github.com/uber-go/zap/actions/workflows/go.yml/badge.svg +[ci]: https://github.com/uber-go/zap/actions/workflows/go.yml [cov-img]: https://codecov.io/gh/uber-go/zap/branch/master/graph/badge.svg [cov]: https://codecov.io/gh/uber-go/zap [benchmarking suite]: https://github.com/uber-go/zap/tree/master/benchmarks -[glide.lock]: https://github.com/uber-go/zap/blob/master/glide.lock +[benchmarks/go.mod]: https://github.com/uber-go/zap/blob/master/benchmarks/go.mod diff --git a/vendor/go.uber.org/zap/CHANGELOG.md b/vendor/go.uber.org/zap/CHANGELOG.md index 794ee303e138..0db1f9f15fee 100644 --- a/vendor/go.uber.org/zap/CHANGELOG.md +++ b/vendor/go.uber.org/zap/CHANGELOG.md @@ -3,9 +3,110 @@ All notable changes to this project will be documented in this file. This project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.html). +## 1.24.0 (30 Nov 2022) + +Enhancements: +* [#1148][]: Add `Level` to both `Logger` and `SugaredLogger` that reports the + current minimum enabled log level. +* [#1185][]: `SugaredLogger` turns errors to zap.Error automatically. + +Thanks to @Abirdcfly, @craigpastro, @nnnkkk7, and @sashamelentyev for their +contributions to this release. + +[#1148]: https://github.coml/uber-go/zap/pull/1148 +[#1185]: https://github.coml/uber-go/zap/pull/1185 + +## 1.23.0 (24 Aug 2022) + +Enhancements: +* [#1147][]: Add a `zapcore.LevelOf` function to determine the level of a + `LevelEnabler` or `Core`. +* [#1155][]: Add `zap.Stringers` field constructor to log arrays of objects + that implement `String() string`. + +[#1147]: https://github.com/uber-go/zap/pull/1147 +[#1155]: https://github.com/uber-go/zap/pull/1155 + + +## 1.22.0 (8 Aug 2022) + +Enhancements: +* [#1071][]: Add `zap.Objects` and `zap.ObjectValues` field constructors to log + arrays of objects. With these two constructors, you don't need to implement + `zapcore.ArrayMarshaler` for use with `zap.Array` if those objects implement + `zapcore.ObjectMarshaler`. +* [#1079][]: Add `SugaredLogger.WithOptions` to build a copy of an existing + `SugaredLogger` with the provided options applied. +* [#1080][]: Add `*ln` variants to `SugaredLogger` for each log level. + These functions provide a string joining behavior similar to `fmt.Println`. +* [#1088][]: Add `zap.WithFatalHook` option to control the behavior of the + logger for `Fatal`-level log entries. This defaults to exiting the program. +* [#1108][]: Add a `zap.Must` function that you can use with `NewProduction` or + `NewDevelopment` to panic if the system was unable to build the logger. +* [#1118][]: Add a `Logger.Log` method that allows specifying the log level for + a statement dynamically. + +Thanks to @cardil, @craigpastro, @sashamelentyev, @shota3506, and @zhupeijun +for their contributions to this release. + +[#1071]: https://github.com/uber-go/zap/pull/1071 +[#1079]: https://github.com/uber-go/zap/pull/1079 +[#1080]: https://github.com/uber-go/zap/pull/1080 +[#1088]: https://github.com/uber-go/zap/pull/1088 +[#1108]: https://github.com/uber-go/zap/pull/1108 +[#1118]: https://github.com/uber-go/zap/pull/1118 + +## 1.21.0 (7 Feb 2022) + +Enhancements: +* [#1047][]: Add `zapcore.ParseLevel` to parse a `Level` from a string. +* [#1048][]: Add `zap.ParseAtomicLevel` to parse an `AtomicLevel` from a + string. + +Bugfixes: +* [#1058][]: Fix panic in JSON encoder when `EncodeLevel` is unset. + +Other changes: +* [#1052][]: Improve encoding performance when the `AddCaller` and + `AddStacktrace` options are used together. + +[#1047]: https://github.com/uber-go/zap/pull/1047 +[#1048]: https://github.com/uber-go/zap/pull/1048 +[#1052]: https://github.com/uber-go/zap/pull/1052 +[#1058]: https://github.com/uber-go/zap/pull/1058 + +Thanks to @aerosol and @Techassi for their contributions to this release. + +## 1.20.0 (4 Jan 2022) + +Enhancements: +* [#989][]: Add `EncoderConfig.SkipLineEnding` flag to disable adding newline + characters between log statements. +* [#1039][]: Add `EncoderConfig.NewReflectedEncoder` field to customize JSON + encoding of reflected log fields. + +Bugfixes: +* [#1011][]: Fix inaccurate precision when encoding complex64 as JSON. +* [#554][], [#1017][]: Close JSON namespaces opened in `MarshalLogObject` + methods when the methods return. +* [#1033][]: Avoid panicking in Sampler core if `thereafter` is zero. + +Other changes: +* [#1028][]: Drop support for Go < 1.15. + +[#554]: https://github.com/uber-go/zap/pull/554 +[#989]: https://github.com/uber-go/zap/pull/989 +[#1011]: https://github.com/uber-go/zap/pull/1011 +[#1017]: https://github.com/uber-go/zap/pull/1017 +[#1028]: https://github.com/uber-go/zap/pull/1028 +[#1033]: https://github.com/uber-go/zap/pull/1033 +[#1039]: https://github.com/uber-go/zap/pull/1039 + +Thanks to @psrajat, @lruggieri, @sammyrnycreal for their contributions to this release. + ## 1.19.1 (8 Sep 2021) -### Fixed +Bugfixes: * [#1001][]: JSON: Fix complex number encoding with negative imaginary part. Thanks to @hemantjadon. * [#1003][]: JSON: Fix inaccurate precision when encoding float32. diff --git a/vendor/go.uber.org/zap/CONTRIBUTING.md b/vendor/go.uber.org/zap/CONTRIBUTING.md index 5cd965687138..ea02f3cae2d6 100644 --- a/vendor/go.uber.org/zap/CONTRIBUTING.md +++ b/vendor/go.uber.org/zap/CONTRIBUTING.md @@ -16,7 +16,7 @@ you to accept the CLA when you open your pull request. [Fork][fork], then clone the repository: -``` +```bash mkdir -p $GOPATH/src/go.uber.org cd $GOPATH/src/go.uber.org git clone git@github.com:your_github_username/zap.git @@ -27,21 +27,16 @@ git fetch upstream Make sure that the tests and the linters pass: -``` +```bash make test make lint ``` -If you're not using the minor version of Go specified in the Makefile's -`LINTABLE_MINOR_VERSIONS` variable, `make lint` doesn't do anything. This is -fine, but it means that you'll only discover lint failures after you open your -pull request. - ## Making Changes Start by creating a new branch for your changes: -``` +```bash cd $GOPATH/src/go.uber.org/zap git checkout master git fetch upstream @@ -52,22 +47,22 @@ git checkout -b cool_new_feature Make your changes, then ensure that `make lint` and `make test` still pass. If you're satisfied with your changes, push them to your fork. -``` +```bash git push origin cool_new_feature ``` Then use the GitHub UI to open a pull request. -At this point, you're waiting on us to review your changes. We *try* to respond +At this point, you're waiting on us to review your changes. We _try_ to respond to issues and pull requests within a few business days, and we may suggest some improvements or alternatives. Once your changes are approved, one of the project maintainers will merge them. We're much more likely to approve your changes if you: -* Add tests for new functionality. -* Write a [good commit message][commit-message]. -* Maintain backward compatibility. +- Add tests for new functionality. +- Write a [good commit message][commit-message]. +- Maintain backward compatibility. [fork]: https://github.com/uber-go/zap/fork [open-issue]: https://github.com/uber-go/zap/issues/new diff --git a/vendor/go.uber.org/zap/README.md b/vendor/go.uber.org/zap/README.md index 1e64d6cffc13..a553a428c8f6 100644 --- a/vendor/go.uber.org/zap/README.md +++ b/vendor/go.uber.org/zap/README.md @@ -54,7 +54,7 @@ and make many small allocations. Put differently, using `encoding/json` and Zap takes a different approach. It includes a reflection-free, zero-allocation JSON encoder, and the base `Logger` strives to avoid serialization overhead and allocations wherever possible. By building the high-level `SugaredLogger` -on that foundation, zap lets users *choose* when they need to count every +on that foundation, zap lets users _choose_ when they need to count every allocation and when they'd prefer a more familiar, loosely typed API. As measured by its own [benchmarking suite][], not only is zap more performant @@ -64,40 +64,40 @@ id="anchor-versions">[1](#footnote-versions) Log a message and 10 fields: -| Package | Time | Time % to zap | Objects Allocated | -| :------ | :--: | :-----------: | :---------------: | -| :zap: zap | 862 ns/op | +0% | 5 allocs/op -| :zap: zap (sugared) | 1250 ns/op | +45% | 11 allocs/op -| zerolog | 4021 ns/op | +366% | 76 allocs/op -| go-kit | 4542 ns/op | +427% | 105 allocs/op -| apex/log | 26785 ns/op | +3007% | 115 allocs/op -| logrus | 29501 ns/op | +3322% | 125 allocs/op -| log15 | 29906 ns/op | +3369% | 122 allocs/op +| Package | Time | Time % to zap | Objects Allocated | +| :------------------ | :---------: | :-----------: | :---------------: | +| :zap: zap | 2900 ns/op | +0% | 5 allocs/op | +| :zap: zap (sugared) | 3475 ns/op | +20% | 10 allocs/op | +| zerolog | 10639 ns/op | +267% | 32 allocs/op | +| go-kit | 14434 ns/op | +398% | 59 allocs/op | +| logrus | 17104 ns/op | +490% | 81 allocs/op | +| apex/log | 32424 ns/op | +1018% | 66 allocs/op | +| log15 | 33579 ns/op | +1058% | 76 allocs/op | Log a message with a logger that already has 10 fields of context: -| Package | Time | Time % to zap | Objects Allocated | -| :------ | :--: | :-----------: | :---------------: | -| :zap: zap | 126 ns/op | +0% | 0 allocs/op -| :zap: zap (sugared) | 187 ns/op | +48% | 2 allocs/op -| zerolog | 88 ns/op | -30% | 0 allocs/op -| go-kit | 5087 ns/op | +3937% | 103 allocs/op -| log15 | 18548 ns/op | +14621% | 73 allocs/op -| apex/log | 26012 ns/op | +20544% | 104 allocs/op -| logrus | 27236 ns/op | +21516% | 113 allocs/op +| Package | Time | Time % to zap | Objects Allocated | +| :------------------ | :---------: | :-----------: | :---------------: | +| :zap: zap | 373 ns/op | +0% | 0 allocs/op | +| :zap: zap (sugared) | 452 ns/op | +21% | 1 allocs/op | +| zerolog | 288 ns/op | -23% | 0 allocs/op | +| go-kit | 11785 ns/op | +3060% | 58 allocs/op | +| logrus | 19629 ns/op | +5162% | 70 allocs/op | +| log15 | 21866 ns/op | +5762% | 72 allocs/op | +| apex/log | 30890 ns/op | +8182% | 55 allocs/op | Log a static string, without any context or `printf`-style templating: -| Package | Time | Time % to zap | Objects Allocated | -| :------ | :--: | :-----------: | :---------------: | -| :zap: zap | 118 ns/op | +0% | 0 allocs/op -| :zap: zap (sugared) | 191 ns/op | +62% | 2 allocs/op -| zerolog | 93 ns/op | -21% | 0 allocs/op -| go-kit | 280 ns/op | +137% | 11 allocs/op -| standard library | 499 ns/op | +323% | 2 allocs/op -| apex/log | 1990 ns/op | +1586% | 10 allocs/op -| logrus | 3129 ns/op | +2552% | 24 allocs/op -| log15 | 3887 ns/op | +3194% | 23 allocs/op +| Package | Time | Time % to zap | Objects Allocated | +| :------------------ | :--------: | :-----------: | :---------------: | +| :zap: zap | 381 ns/op | +0% | 0 allocs/op | +| :zap: zap (sugared) | 410 ns/op | +8% | 1 allocs/op | +| zerolog | 369 ns/op | -3% | 0 allocs/op | +| standard library | 385 ns/op | +1% | 2 allocs/op | +| go-kit | 606 ns/op | +59% | 11 allocs/op | +| logrus | 1730 ns/op | +354% | 25 allocs/op | +| apex/log | 1998 ns/op | +424% | 7 allocs/op | +| log15 | 4546 ns/op | +1093% | 22 allocs/op | ## Development Status: Stable @@ -131,4 +131,3 @@ pinned in the [benchmarks/go.mod][] file. [↩](#anchor-versions) [cov]: https://codecov.io/gh/uber-go/zap [benchmarking suite]: https://github.com/uber-go/zap/tree/master/benchmarks [benchmarks/go.mod]: https://github.com/uber-go/zap/blob/master/benchmarks/go.mod - diff --git a/vendor/go.uber.org/zap/array_go118.go b/vendor/go.uber.org/zap/array_go118.go new file mode 100644 index 000000000000..d0d2c49d698a --- /dev/null +++ b/vendor/go.uber.org/zap/array_go118.go @@ -0,0 +1,156 @@ +// Copyright (c) 2022 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +//go:build go1.18 +// +build go1.18 + +package zap + +import ( + "fmt" + + "go.uber.org/zap/zapcore" +) + +// Objects constructs a field with the given key, holding a list of the +// provided objects that can be marshaled by Zap. +// +// Note that these objects must implement zapcore.ObjectMarshaler directly. +// That is, if you're trying to marshal a []Request, the MarshalLogObject +// method must be declared on the Request type, not its pointer (*Request). +// If it's on the pointer, use ObjectValues. +// +// Given an object that implements MarshalLogObject on the value receiver, you +// can log a slice of those objects with Objects like so: +// +// type Author struct{ ... } +// func (a Author) MarshalLogObject(enc zapcore.ObjectEncoder) error +// +// var authors []Author = ... +// logger.Info("loading article", zap.Objects("authors", authors)) +// +// Similarly, given a type that implements MarshalLogObject on its pointer +// receiver, you can log a slice of pointers to that object with Objects like +// so: +// +// type Request struct{ ... } +// func (r *Request) MarshalLogObject(enc zapcore.ObjectEncoder) error +// +// var requests []*Request = ... +// logger.Info("sending requests", zap.Objects("requests", requests)) +// +// If instead, you have a slice of values of such an object, use the +// ObjectValues constructor. +// +// var requests []Request = ... +// logger.Info("sending requests", zap.ObjectValues("requests", requests)) +func Objects[T zapcore.ObjectMarshaler](key string, values []T) Field { + return Array(key, objects[T](values)) +} + +type objects[T zapcore.ObjectMarshaler] []T + +func (os objects[T]) MarshalLogArray(arr zapcore.ArrayEncoder) error { + for _, o := range os { + if err := arr.AppendObject(o); err != nil { + return err + } + } + return nil +} + +// ObjectMarshalerPtr is a constraint that specifies that the given type +// implements zapcore.ObjectMarshaler on a pointer receiver. +type ObjectMarshalerPtr[T any] interface { + *T + zapcore.ObjectMarshaler +} + +// ObjectValues constructs a field with the given key, holding a list of the +// provided objects, where pointers to these objects can be marshaled by Zap. +// +// Note that pointers to these objects must implement zapcore.ObjectMarshaler. +// That is, if you're trying to marshal a []Request, the MarshalLogObject +// method must be declared on the *Request type, not the value (Request). +// If it's on the value, use Objects. +// +// Given an object that implements MarshalLogObject on the pointer receiver, +// you can log a slice of those objects with ObjectValues like so: +// +// type Request struct{ ... } +// func (r *Request) MarshalLogObject(enc zapcore.ObjectEncoder) error +// +// var requests []Request = ... +// logger.Info("sending requests", zap.ObjectValues("requests", requests)) +// +// If instead, you have a slice of pointers of such an object, use the Objects +// field constructor. +// +// var requests []*Request = ... +// logger.Info("sending requests", zap.Objects("requests", requests)) +func ObjectValues[T any, P ObjectMarshalerPtr[T]](key string, values []T) Field { + return Array(key, objectValues[T, P](values)) +} + +type objectValues[T any, P ObjectMarshalerPtr[T]] []T + +func (os objectValues[T, P]) MarshalLogArray(arr zapcore.ArrayEncoder) error { + for i := range os { + // It is necessary for us to explicitly reference the "P" type. + // We cannot simply pass "&os[i]" to AppendObject because its type + // is "*T", which the type system does not consider as + // implementing ObjectMarshaler. + // Only the type "P" satisfies ObjectMarshaler, which we have + // to convert "*T" to explicitly. + var p P = &os[i] + if err := arr.AppendObject(p); err != nil { + return err + } + } + return nil +} + +// Stringers constructs a field with the given key, holding a list of the +// output provided by the value's String method +// +// Given an object that implements String on the value receiver, you +// can log a slice of those objects with Objects like so: +// +// type Request struct{ ... } +// func (a Request) String() string +// +// var requests []Request = ... +// logger.Info("sending requests", zap.Stringers("requests", requests)) +// +// Note that these objects must implement fmt.Stringer directly. +// That is, if you're trying to marshal a []Request, the String method +// must be declared on the Request type, not its pointer (*Request). +func Stringers[T fmt.Stringer](key string, values []T) Field { + return Array(key, stringers[T](values)) +} + +type stringers[T fmt.Stringer] []T + +func (os stringers[T]) MarshalLogArray(arr zapcore.ArrayEncoder) error { + for _, o := range os { + arr.AppendString(o.String()) + } + return nil +} diff --git a/vendor/go.uber.org/zap/config.go b/vendor/go.uber.org/zap/config.go index 55637fb0b4b1..ee6096766a85 100644 --- a/vendor/go.uber.org/zap/config.go +++ b/vendor/go.uber.org/zap/config.go @@ -21,7 +21,7 @@ package zap import ( - "fmt" + "errors" "sort" "time" @@ -182,7 +182,7 @@ func (cfg Config) Build(opts ...Option) (*Logger, error) { } if cfg.Level == (AtomicLevel{}) { - return nil, fmt.Errorf("missing Level") + return nil, errors.New("missing Level") } log := New( diff --git a/vendor/go.uber.org/zap/doc.go b/vendor/go.uber.org/zap/doc.go index 8638dd1b9656..3c50d7b4d3ff 100644 --- a/vendor/go.uber.org/zap/doc.go +++ b/vendor/go.uber.org/zap/doc.go @@ -32,7 +32,7 @@ // they need to count every allocation and when they'd prefer a more familiar, // loosely typed API. // -// Choosing a Logger +// # Choosing a Logger // // In contexts where performance is nice, but not critical, use the // SugaredLogger. It's 4-10x faster than other structured logging packages and @@ -41,14 +41,15 @@ // variadic number of key-value pairs. (For more advanced use cases, they also // accept strongly typed fields - see the SugaredLogger.With documentation for // details.) -// sugar := zap.NewExample().Sugar() -// defer sugar.Sync() -// sugar.Infow("failed to fetch URL", -// "url", "http://example.com", -// "attempt", 3, -// "backoff", time.Second, -// ) -// sugar.Infof("failed to fetch URL: %s", "http://example.com") +// +// sugar := zap.NewExample().Sugar() +// defer sugar.Sync() +// sugar.Infow("failed to fetch URL", +// "url", "http://example.com", +// "attempt", 3, +// "backoff", time.Second, +// ) +// sugar.Infof("failed to fetch URL: %s", "http://example.com") // // By default, loggers are unbuffered. However, since zap's low-level APIs // allow buffering, calling Sync before letting your process exit is a good @@ -57,32 +58,35 @@ // In the rare contexts where every microsecond and every allocation matter, // use the Logger. It's even faster than the SugaredLogger and allocates far // less, but it only supports strongly-typed, structured logging. -// logger := zap.NewExample() -// defer logger.Sync() -// logger.Info("failed to fetch URL", -// zap.String("url", "http://example.com"), -// zap.Int("attempt", 3), -// zap.Duration("backoff", time.Second), -// ) +// +// logger := zap.NewExample() +// defer logger.Sync() +// logger.Info("failed to fetch URL", +// zap.String("url", "http://example.com"), +// zap.Int("attempt", 3), +// zap.Duration("backoff", time.Second), +// ) // // Choosing between the Logger and SugaredLogger doesn't need to be an // application-wide decision: converting between the two is simple and // inexpensive. -// logger := zap.NewExample() -// defer logger.Sync() -// sugar := logger.Sugar() -// plain := sugar.Desugar() // -// Configuring Zap +// logger := zap.NewExample() +// defer logger.Sync() +// sugar := logger.Sugar() +// plain := sugar.Desugar() +// +// # Configuring Zap // // The simplest way to build a Logger is to use zap's opinionated presets: // NewExample, NewProduction, and NewDevelopment. These presets build a logger // with a single function call: -// logger, err := zap.NewProduction() -// if err != nil { -// log.Fatalf("can't initialize zap logger: %v", err) -// } -// defer logger.Sync() +// +// logger, err := zap.NewProduction() +// if err != nil { +// log.Fatalf("can't initialize zap logger: %v", err) +// } +// defer logger.Sync() // // Presets are fine for small projects, but larger projects and organizations // naturally require a bit more customization. For most users, zap's Config @@ -94,7 +98,7 @@ // go.uber.org/zap/zapcore. See the package-level AdvancedConfiguration // example for sample code. // -// Extending Zap +// # Extending Zap // // The zap package itself is a relatively thin wrapper around the interfaces // in go.uber.org/zap/zapcore. Extending zap to support a new encoding (e.g., @@ -106,7 +110,7 @@ // Similarly, package authors can use the high-performance Encoder and Core // implementations in the zapcore package to build their own loggers. // -// Frequently Asked Questions +// # Frequently Asked Questions // // An FAQ covering everything from installation errors to design decisions is // available at https://github.com/uber-go/zap/blob/master/FAQ.md. diff --git a/vendor/go.uber.org/zap/encoder.go b/vendor/go.uber.org/zap/encoder.go index 08ed83354360..caa04ceefd81 100644 --- a/vendor/go.uber.org/zap/encoder.go +++ b/vendor/go.uber.org/zap/encoder.go @@ -63,7 +63,7 @@ func RegisterEncoder(name string, constructor func(zapcore.EncoderConfig) (zapco func newEncoder(name string, encoderConfig zapcore.EncoderConfig) (zapcore.Encoder, error) { if encoderConfig.TimeKey != "" && encoderConfig.EncodeTime == nil { - return nil, fmt.Errorf("missing EncodeTime in EncoderConfig") + return nil, errors.New("missing EncodeTime in EncoderConfig") } _encoderMutex.RLock() diff --git a/vendor/go.uber.org/zap/global.go b/vendor/go.uber.org/zap/global.go index c1ac0507cd9b..3cb46c9e0ac5 100644 --- a/vendor/go.uber.org/zap/global.go +++ b/vendor/go.uber.org/zap/global.go @@ -31,6 +31,7 @@ import ( ) const ( + _stdLogDefaultDepth = 1 _loggerWriterDepth = 2 _programmerErrorTemplate = "You've found a bug in zap! Please file a bug at " + "https://github.com/uber-go/zap/issues/new and reference this error: %v" diff --git a/vendor/go.uber.org/zap/http_handler.go b/vendor/go.uber.org/zap/http_handler.go index 1297c33b3285..632b6831a856 100644 --- a/vendor/go.uber.org/zap/http_handler.go +++ b/vendor/go.uber.org/zap/http_handler.go @@ -22,6 +22,7 @@ package zap import ( "encoding/json" + "errors" "fmt" "io" "net/http" @@ -32,22 +33,23 @@ import ( // ServeHTTP is a simple JSON endpoint that can report on or change the current // logging level. // -// GET +// # GET // // The GET request returns a JSON description of the current logging level like: -// {"level":"info"} // -// PUT +// {"level":"info"} +// +// # PUT // // The PUT request changes the logging level. It is perfectly safe to change the // logging level while a program is running. Two content types are supported: // -// Content-Type: application/x-www-form-urlencoded +// Content-Type: application/x-www-form-urlencoded // // With this content type, the level can be provided through the request body or // a query parameter. The log level is URL encoded like: // -// level=debug +// level=debug // // The request body takes precedence over the query parameter, if both are // specified. @@ -55,18 +57,17 @@ import ( // This content type is the default for a curl PUT request. Following are two // example curl requests that both set the logging level to debug. // -// curl -X PUT localhost:8080/log/level?level=debug -// curl -X PUT localhost:8080/log/level -d level=debug +// curl -X PUT localhost:8080/log/level?level=debug +// curl -X PUT localhost:8080/log/level -d level=debug // // For any other content type, the payload is expected to be JSON encoded and // look like: // -// {"level":"info"} +// {"level":"info"} // // An example curl request could look like this: // -// curl -X PUT localhost:8080/log/level -H "Content-Type: application/json" -d '{"level":"debug"}' -// +// curl -X PUT localhost:8080/log/level -H "Content-Type: application/json" -d '{"level":"debug"}' func (lvl AtomicLevel) ServeHTTP(w http.ResponseWriter, r *http.Request) { type errorResponse struct { Error string `json:"error"` @@ -108,7 +109,7 @@ func decodePutRequest(contentType string, r *http.Request) (zapcore.Level, error func decodePutURL(r *http.Request) (zapcore.Level, error) { lvl := r.FormValue("level") if lvl == "" { - return 0, fmt.Errorf("must specify logging level") + return 0, errors.New("must specify logging level") } var l zapcore.Level if err := l.UnmarshalText([]byte(lvl)); err != nil { @@ -125,7 +126,7 @@ func decodePutJSON(body io.Reader) (zapcore.Level, error) { return 0, fmt.Errorf("malformed request body: %v", err) } if pld.Level == nil { - return 0, fmt.Errorf("must specify logging level") + return 0, errors.New("must specify logging level") } return *pld.Level, nil diff --git a/vendor/go.uber.org/zap/internal/exit/exit.go b/vendor/go.uber.org/zap/internal/exit/exit.go index dfc5b05feb77..f673f9947b85 100644 --- a/vendor/go.uber.org/zap/internal/exit/exit.go +++ b/vendor/go.uber.org/zap/internal/exit/exit.go @@ -24,24 +24,25 @@ package exit import "os" -var real = func() { os.Exit(1) } +var _exit = os.Exit -// Exit normally terminates the process by calling os.Exit(1). If the package -// is stubbed, it instead records a call in the testing spy. -func Exit() { - real() +// With terminates the process by calling os.Exit(code). If the package is +// stubbed, it instead records a call in the testing spy. +func With(code int) { + _exit(code) } // A StubbedExit is a testing fake for os.Exit. type StubbedExit struct { Exited bool - prev func() + Code int + prev func(code int) } // Stub substitutes a fake for the call to os.Exit(1). func Stub() *StubbedExit { - s := &StubbedExit{prev: real} - real = s.exit + s := &StubbedExit{prev: _exit} + _exit = s.exit return s } @@ -56,9 +57,10 @@ func WithStub(f func()) *StubbedExit { // Unstub restores the previous exit function. func (se *StubbedExit) Unstub() { - real = se.prev + _exit = se.prev } -func (se *StubbedExit) exit() { +func (se *StubbedExit) exit(code int) { se.Exited = true + se.Code = code } diff --git a/vendor/go.uber.org/zap/global_go112.go b/vendor/go.uber.org/zap/internal/level_enabler.go similarity index 70% rename from vendor/go.uber.org/zap/global_go112.go rename to vendor/go.uber.org/zap/internal/level_enabler.go index 6b5dbda80768..5f3e3f1b924a 100644 --- a/vendor/go.uber.org/zap/global_go112.go +++ b/vendor/go.uber.org/zap/internal/level_enabler.go @@ -1,4 +1,4 @@ -// Copyright (c) 2019 Uber Technologies, Inc. +// Copyright (c) 2022 Uber Technologies, Inc. // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal @@ -18,9 +18,18 @@ // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. -// See #682 for more information. -// +build go1.12 +package internal -package zap +import "go.uber.org/zap/zapcore" -const _stdLogDefaultDepth = 1 +// LeveledEnabler is an interface satisfied by LevelEnablers that are able to +// report their own level. +// +// This interface is defined to use more conveniently in tests and non-zapcore +// packages. +// This cannot be imported from zapcore because of the cyclic dependency. +type LeveledEnabler interface { + zapcore.LevelEnabler + + Level() zapcore.Level +} diff --git a/vendor/go.uber.org/zap/internal/ztest/clock.go b/vendor/go.uber.org/zap/internal/ztest/clock.go new file mode 100644 index 000000000000..fe8026d94333 --- /dev/null +++ b/vendor/go.uber.org/zap/internal/ztest/clock.go @@ -0,0 +1,50 @@ +// Copyright (c) 2021 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package ztest + +import ( + "time" + + "github.com/benbjohnson/clock" +) + +// MockClock provides control over the time. +type MockClock struct{ m *clock.Mock } + +// NewMockClock builds a new mock clock that provides control of time. +func NewMockClock() *MockClock { + return &MockClock{clock.NewMock()} +} + +// Now reports the current time. +func (c *MockClock) Now() time.Time { + return c.m.Now() +} + +// NewTicker returns a time.Ticker that ticks at the specified frequency. +func (c *MockClock) NewTicker(d time.Duration) *time.Ticker { + return &time.Ticker{C: c.m.Ticker(d).C} +} + +// Add progresses time by the given duration. +func (c *MockClock) Add(d time.Duration) { + c.m.Add(d) +} diff --git a/vendor/go.uber.org/zap/internal/ztest/timeout.go b/vendor/go.uber.org/zap/internal/ztest/timeout.go index f7d58f31657f..e4222f947996 100644 --- a/vendor/go.uber.org/zap/internal/ztest/timeout.go +++ b/vendor/go.uber.org/zap/internal/ztest/timeout.go @@ -42,11 +42,11 @@ func Sleep(base time.Duration) { // Initialize checks the environment and alters the timeout scale accordingly. // It returns a function to undo the scaling. func Initialize(factor string) func() { - original := _timeoutScale fv, err := strconv.ParseFloat(factor, 64) if err != nil { panic(err) } + original := _timeoutScale _timeoutScale = fv return func() { _timeoutScale = original } } diff --git a/vendor/go.uber.org/zap/internal/ztest/writer.go b/vendor/go.uber.org/zap/internal/ztest/writer.go index 9fdd5805e2c3..f54d8569ee2f 100644 --- a/vendor/go.uber.org/zap/internal/ztest/writer.go +++ b/vendor/go.uber.org/zap/internal/ztest/writer.go @@ -23,7 +23,7 @@ package ztest import ( "bytes" "errors" - "io/ioutil" + "io" "strings" ) @@ -50,12 +50,12 @@ func (s *Syncer) Called() bool { return s.called } -// A Discarder sends all writes to ioutil.Discard. +// A Discarder sends all writes to io.Discard. type Discarder struct{ Syncer } // Write implements io.Writer. func (d *Discarder) Write(b []byte) (int, error) { - return ioutil.Discard.Write(b) + return io.Discard.Write(b) } // FailWriter is a WriteSyncer that always returns an error on writes. diff --git a/vendor/go.uber.org/zap/level.go b/vendor/go.uber.org/zap/level.go index 3567a9a1e6a3..db951e19a50f 100644 --- a/vendor/go.uber.org/zap/level.go +++ b/vendor/go.uber.org/zap/level.go @@ -22,6 +22,7 @@ package zap import ( "go.uber.org/atomic" + "go.uber.org/zap/internal" "go.uber.org/zap/zapcore" ) @@ -70,6 +71,8 @@ type AtomicLevel struct { l *atomic.Int32 } +var _ internal.LeveledEnabler = AtomicLevel{} + // NewAtomicLevel creates an AtomicLevel with InfoLevel and above logging // enabled. func NewAtomicLevel() AtomicLevel { @@ -86,6 +89,23 @@ func NewAtomicLevelAt(l zapcore.Level) AtomicLevel { return a } +// ParseAtomicLevel parses an AtomicLevel based on a lowercase or all-caps ASCII +// representation of the log level. If the provided ASCII representation is +// invalid an error is returned. +// +// This is particularly useful when dealing with text input to configure log +// levels. +func ParseAtomicLevel(text string) (AtomicLevel, error) { + a := NewAtomicLevel() + l, err := zapcore.ParseLevel(text) + if err != nil { + return a, err + } + + a.SetLevel(l) + return a, nil +} + // Enabled implements the zapcore.LevelEnabler interface, which allows the // AtomicLevel to be used in place of traditional static levels. func (lvl AtomicLevel) Enabled(l zapcore.Level) bool { diff --git a/vendor/go.uber.org/zap/logger.go b/vendor/go.uber.org/zap/logger.go index f116bd936fe2..cd44030d13f0 100644 --- a/vendor/go.uber.org/zap/logger.go +++ b/vendor/go.uber.org/zap/logger.go @@ -22,11 +22,11 @@ package zap import ( "fmt" - "io/ioutil" + "io" "os" - "runtime" "strings" + "go.uber.org/zap/internal/bufferpool" "go.uber.org/zap/zapcore" ) @@ -42,7 +42,7 @@ type Logger struct { development bool addCaller bool - onFatal zapcore.CheckWriteAction // default is WriteThenFatal + onFatal zapcore.CheckWriteHook // default is WriteThenFatal name string errorOutput zapcore.WriteSyncer @@ -85,7 +85,7 @@ func New(core zapcore.Core, options ...Option) *Logger { func NewNop() *Logger { return &Logger{ core: zapcore.NewNopCore(), - errorOutput: zapcore.AddSync(ioutil.Discard), + errorOutput: zapcore.AddSync(io.Discard), addStack: zapcore.FatalLevel + 1, clock: zapcore.DefaultClock, } @@ -107,6 +107,19 @@ func NewDevelopment(options ...Option) (*Logger, error) { return NewDevelopmentConfig().Build(options...) } +// Must is a helper that wraps a call to a function returning (*Logger, error) +// and panics if the error is non-nil. It is intended for use in variable +// initialization such as: +// +// var logger = zap.Must(zap.NewProduction()) +func Must(logger *Logger, err error) *Logger { + if err != nil { + panic(err) + } + + return logger +} + // NewExample builds a Logger that's designed for use in zap's testable // examples. It writes DebugLevel and above logs to standard out as JSON, but // omits the timestamp and calling function to keep example output @@ -170,6 +183,13 @@ func (log *Logger) With(fields ...Field) *Logger { return l } +// Level reports the minimum enabled level for this logger. +// +// For NopLoggers, this is [zapcore.InvalidLevel]. +func (log *Logger) Level() zapcore.Level { + return zapcore.LevelOf(log.core) +} + // Check returns a CheckedEntry if logging a message at the specified level // is enabled. It's a completely optional optimization; in high-performance // applications, Check can help avoid allocating a slice to hold fields. @@ -177,6 +197,14 @@ func (log *Logger) Check(lvl zapcore.Level, msg string) *zapcore.CheckedEntry { return log.check(lvl, msg) } +// Log logs a message at the specified level. The message includes any fields +// passed at the log site, as well as any fields accumulated on the logger. +func (log *Logger) Log(lvl zapcore.Level, msg string, fields ...Field) { + if ce := log.check(lvl, msg); ce != nil { + ce.Write(fields...) + } +} + // Debug logs a message at DebugLevel. The message includes any fields passed // at the log site, as well as any fields accumulated on the logger. func (log *Logger) Debug(msg string, fields ...Field) { @@ -259,8 +287,10 @@ func (log *Logger) clone() *Logger { } func (log *Logger) check(lvl zapcore.Level, msg string) *zapcore.CheckedEntry { - // check must always be called directly by a method in the Logger interface - // (e.g., Check, Info, Fatal). + // Logger.check must always be called directly by a method in the + // Logger interface (e.g., Check, Info, Fatal). + // This skips Logger.check and the Info/Fatal/Check/etc. method that + // called it. const callerSkipOffset = 2 // Check the level first to reduce the cost of disabled log calls. @@ -283,18 +313,27 @@ func (log *Logger) check(lvl zapcore.Level, msg string) *zapcore.CheckedEntry { // Set up any required terminal behavior. switch ent.Level { case zapcore.PanicLevel: - ce = ce.Should(ent, zapcore.WriteThenPanic) + ce = ce.After(ent, zapcore.WriteThenPanic) case zapcore.FatalLevel: onFatal := log.onFatal - // Noop is the default value for CheckWriteAction, and it leads to - // continued execution after a Fatal which is unexpected. - if onFatal == zapcore.WriteThenNoop { + // nil or WriteThenNoop will lead to continued execution after + // a Fatal log entry, which is unexpected. For example, + // + // f, err := os.Open(..) + // if err != nil { + // log.Fatal("cannot open", zap.Error(err)) + // } + // fmt.Println(f.Name()) + // + // The f.Name() will panic if we continue execution after the + // log.Fatal. + if onFatal == nil || onFatal == zapcore.WriteThenNoop { onFatal = zapcore.WriteThenFatal } - ce = ce.Should(ent, onFatal) + ce = ce.After(ent, onFatal) case zapcore.DPanicLevel: if log.development { - ce = ce.Should(ent, zapcore.WriteThenPanic) + ce = ce.After(ent, zapcore.WriteThenPanic) } } @@ -307,42 +346,55 @@ func (log *Logger) check(lvl zapcore.Level, msg string) *zapcore.CheckedEntry { // Thread the error output through to the CheckedEntry. ce.ErrorOutput = log.errorOutput - if log.addCaller { - frame, defined := getCallerFrame(log.callerSkip + callerSkipOffset) - if !defined { + + addStack := log.addStack.Enabled(ce.Level) + if !log.addCaller && !addStack { + return ce + } + + // Adding the caller or stack trace requires capturing the callers of + // this function. We'll share information between these two. + stackDepth := stacktraceFirst + if addStack { + stackDepth = stacktraceFull + } + stack := captureStacktrace(log.callerSkip+callerSkipOffset, stackDepth) + defer stack.Free() + + if stack.Count() == 0 { + if log.addCaller { fmt.Fprintf(log.errorOutput, "%v Logger.check error: failed to get caller\n", ent.Time.UTC()) log.errorOutput.Sync() } + return ce + } - ce.Entry.Caller = zapcore.EntryCaller{ - Defined: defined, + frame, more := stack.Next() + + if log.addCaller { + ce.Caller = zapcore.EntryCaller{ + Defined: frame.PC != 0, PC: frame.PC, File: frame.File, Line: frame.Line, Function: frame.Function, } } - if log.addStack.Enabled(ce.Entry.Level) { - ce.Entry.Stack = StackSkip("", log.callerSkip+callerSkipOffset).String - } - return ce -} + if addStack { + buffer := bufferpool.Get() + defer buffer.Free() -// getCallerFrame gets caller frame. The argument skip is the number of stack -// frames to ascend, with 0 identifying the caller of getCallerFrame. The -// boolean ok is false if it was not possible to recover the information. -// -// Note: This implementation is similar to runtime.Caller, but it returns the whole frame. -func getCallerFrame(skip int) (frame runtime.Frame, ok bool) { - const skipOffset = 2 // skip getCallerFrame and Callers - - pc := make([]uintptr, 1) - numFrames := runtime.Callers(skip+skipOffset, pc) - if numFrames < 1 { - return + stackfmt := newStackFormatter(buffer) + + // We've already extracted the first frame, so format that + // separately and defer to stackfmt for the rest. + stackfmt.FormatFrame(frame) + if more { + stackfmt.FormatStack(stack) + } + ce.Stack = buffer.String() } - frame, _ = runtime.CallersFrames(pc).Next() - return frame, frame.PC != 0 + return ce } diff --git a/vendor/go.uber.org/zap/options.go b/vendor/go.uber.org/zap/options.go index e9e66161f510..c4f3bca3d202 100644 --- a/vendor/go.uber.org/zap/options.go +++ b/vendor/go.uber.org/zap/options.go @@ -133,9 +133,28 @@ func IncreaseLevel(lvl zapcore.LevelEnabler) Option { } // OnFatal sets the action to take on fatal logs. +// +// Deprecated: Use [WithFatalHook] instead. func OnFatal(action zapcore.CheckWriteAction) Option { + return WithFatalHook(action) +} + +// WithFatalHook sets a CheckWriteHook to run on fatal logs. +// Zap will call this hook after writing a log statement with a Fatal level. +// +// For example, the following builds a logger that will exit the current +// goroutine after writing a fatal log message, but it will not exit the +// program. +// +// zap.New(core, zap.WithFatalHook(zapcore.WriteThenGoexit)) +// +// It is important that the provided CheckWriteHook stops the control flow at +// the current statement to meet expectations of callers of the logger. +// We recommend calling os.Exit or runtime.Goexit inside custom hooks at +// minimum. +func WithFatalHook(hook zapcore.CheckWriteHook) Option { return optionFunc(func(log *Logger) { - log.onFatal = action + log.onFatal = hook }) } diff --git a/vendor/go.uber.org/zap/sink.go b/vendor/go.uber.org/zap/sink.go index df46fa87a70a..478c9a10ffc3 100644 --- a/vendor/go.uber.org/zap/sink.go +++ b/vendor/go.uber.org/zap/sink.go @@ -1,4 +1,4 @@ -// Copyright (c) 2016 Uber Technologies, Inc. +// Copyright (c) 2016-2022 Uber Technologies, Inc. // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal @@ -26,6 +26,7 @@ import ( "io" "net/url" "os" + "path/filepath" "strings" "sync" @@ -34,23 +35,7 @@ import ( const schemeFile = "file" -var ( - _sinkMutex sync.RWMutex - _sinkFactories map[string]func(*url.URL) (Sink, error) // keyed by scheme -) - -func init() { - resetSinkRegistry() -} - -func resetSinkRegistry() { - _sinkMutex.Lock() - defer _sinkMutex.Unlock() - - _sinkFactories = map[string]func(*url.URL) (Sink, error){ - schemeFile: newFileSink, - } -} +var _sinkRegistry = newSinkRegistry() // Sink defines the interface to write to and close logger destinations. type Sink interface { @@ -58,10 +43,6 @@ type Sink interface { io.Closer } -type nopCloserSink struct{ zapcore.WriteSyncer } - -func (nopCloserSink) Close() error { return nil } - type errSinkNotFound struct { scheme string } @@ -70,16 +51,29 @@ func (e *errSinkNotFound) Error() string { return fmt.Sprintf("no sink found for scheme %q", e.scheme) } -// RegisterSink registers a user-supplied factory for all sinks with a -// particular scheme. -// -// All schemes must be ASCII, valid under section 3.1 of RFC 3986 -// (https://tools.ietf.org/html/rfc3986#section-3.1), and must not already -// have a factory registered. Zap automatically registers a factory for the -// "file" scheme. -func RegisterSink(scheme string, factory func(*url.URL) (Sink, error)) error { - _sinkMutex.Lock() - defer _sinkMutex.Unlock() +type nopCloserSink struct{ zapcore.WriteSyncer } + +func (nopCloserSink) Close() error { return nil } + +type sinkRegistry struct { + mu sync.Mutex + factories map[string]func(*url.URL) (Sink, error) // keyed by scheme + openFile func(string, int, os.FileMode) (*os.File, error) // type matches os.OpenFile +} + +func newSinkRegistry() *sinkRegistry { + sr := &sinkRegistry{ + factories: make(map[string]func(*url.URL) (Sink, error)), + openFile: os.OpenFile, + } + sr.RegisterSink(schemeFile, sr.newFileSinkFromURL) + return sr +} + +// RegisterScheme registers the given factory for the specific scheme. +func (sr *sinkRegistry) RegisterSink(scheme string, factory func(*url.URL) (Sink, error)) error { + sr.mu.Lock() + defer sr.mu.Unlock() if scheme == "" { return errors.New("can't register a sink factory for empty string") @@ -88,14 +82,22 @@ func RegisterSink(scheme string, factory func(*url.URL) (Sink, error)) error { if err != nil { return fmt.Errorf("%q is not a valid scheme: %v", scheme, err) } - if _, ok := _sinkFactories[normalized]; ok { + if _, ok := sr.factories[normalized]; ok { return fmt.Errorf("sink factory already registered for scheme %q", normalized) } - _sinkFactories[normalized] = factory + sr.factories[normalized] = factory return nil } -func newSink(rawURL string) (Sink, error) { +func (sr *sinkRegistry) newSink(rawURL string) (Sink, error) { + // URL parsing doesn't work well for Windows paths such as `c:\log.txt`, as scheme is set to + // the drive, and path is unset unless `c:/log.txt` is used. + // To avoid Windows-specific URL handling, we instead check IsAbs to open as a file. + // filepath.IsAbs is OS-specific, so IsAbs('c:/log.txt') is false outside of Windows. + if filepath.IsAbs(rawURL) { + return sr.newFileSinkFromPath(rawURL) + } + u, err := url.Parse(rawURL) if err != nil { return nil, fmt.Errorf("can't parse %q as a URL: %v", rawURL, err) @@ -104,16 +106,27 @@ func newSink(rawURL string) (Sink, error) { u.Scheme = schemeFile } - _sinkMutex.RLock() - factory, ok := _sinkFactories[u.Scheme] - _sinkMutex.RUnlock() + sr.mu.Lock() + factory, ok := sr.factories[u.Scheme] + sr.mu.Unlock() if !ok { return nil, &errSinkNotFound{u.Scheme} } return factory(u) } -func newFileSink(u *url.URL) (Sink, error) { +// RegisterSink registers a user-supplied factory for all sinks with a +// particular scheme. +// +// All schemes must be ASCII, valid under section 0.1 of RFC 3986 +// (https://tools.ietf.org/html/rfc3983#section-3.1), and must not already +// have a factory registered. Zap automatically registers a factory for the +// "file" scheme. +func RegisterSink(scheme string, factory func(*url.URL) (Sink, error)) error { + return _sinkRegistry.RegisterSink(scheme, factory) +} + +func (sr *sinkRegistry) newFileSinkFromURL(u *url.URL) (Sink, error) { if u.User != nil { return nil, fmt.Errorf("user and password not allowed with file URLs: got %v", u) } @@ -130,13 +143,18 @@ func newFileSink(u *url.URL) (Sink, error) { if hn := u.Hostname(); hn != "" && hn != "localhost" { return nil, fmt.Errorf("file URLs must leave host empty or use localhost: got %v", u) } - switch u.Path { + + return sr.newFileSinkFromPath(u.Path) +} + +func (sr *sinkRegistry) newFileSinkFromPath(path string) (Sink, error) { + switch path { case "stdout": return nopCloserSink{os.Stdout}, nil case "stderr": return nopCloserSink{os.Stderr}, nil } - return os.OpenFile(u.Path, os.O_WRONLY|os.O_APPEND|os.O_CREATE, 0666) + return sr.openFile(path, os.O_WRONLY|os.O_APPEND|os.O_CREATE, 0666) } func normalizeScheme(s string) (string, error) { diff --git a/vendor/go.uber.org/zap/stacktrace.go b/vendor/go.uber.org/zap/stacktrace.go index 0cf8c1ddffa1..817a3bde8b10 100644 --- a/vendor/go.uber.org/zap/stacktrace.go +++ b/vendor/go.uber.org/zap/stacktrace.go @@ -24,62 +24,153 @@ import ( "runtime" "sync" + "go.uber.org/zap/buffer" "go.uber.org/zap/internal/bufferpool" ) -var ( - _stacktracePool = sync.Pool{ - New: func() interface{} { - return newProgramCounters(64) - }, - } +var _stacktracePool = sync.Pool{ + New: func() interface{} { + return &stacktrace{ + storage: make([]uintptr, 64), + } + }, +} + +type stacktrace struct { + pcs []uintptr // program counters; always a subslice of storage + frames *runtime.Frames + + // The size of pcs varies depending on requirements: + // it will be one if the only the first frame was requested, + // and otherwise it will reflect the depth of the call stack. + // + // storage decouples the slice we need (pcs) from the slice we pool. + // We will always allocate a reasonably large storage, but we'll use + // only as much of it as we need. + storage []uintptr +} + +// stacktraceDepth specifies how deep of a stack trace should be captured. +type stacktraceDepth int + +const ( + // stacktraceFirst captures only the first frame. + stacktraceFirst stacktraceDepth = iota + + // stacktraceFull captures the entire call stack, allocating more + // storage for it if needed. + stacktraceFull ) -func takeStacktrace(skip int) string { - buffer := bufferpool.Get() - defer buffer.Free() - programCounters := _stacktracePool.Get().(*programCounters) - defer _stacktracePool.Put(programCounters) - - var numFrames int - for { - // Skip the call to runtime.Callers and takeStacktrace so that the - // program counters start at the caller of takeStacktrace. - numFrames = runtime.Callers(skip+2, programCounters.pcs) - if numFrames < len(programCounters.pcs) { - break - } - // Don't put the too-short counter slice back into the pool; this lets - // the pool adjust if we consistently take deep stacktraces. - programCounters = newProgramCounters(len(programCounters.pcs) * 2) +// captureStacktrace captures a stack trace of the specified depth, skipping +// the provided number of frames. skip=0 identifies the caller of +// captureStacktrace. +// +// The caller must call Free on the returned stacktrace after using it. +func captureStacktrace(skip int, depth stacktraceDepth) *stacktrace { + stack := _stacktracePool.Get().(*stacktrace) + + switch depth { + case stacktraceFirst: + stack.pcs = stack.storage[:1] + case stacktraceFull: + stack.pcs = stack.storage } - i := 0 - frames := runtime.CallersFrames(programCounters.pcs[:numFrames]) + // Unlike other "skip"-based APIs, skip=0 identifies runtime.Callers + // itself. +2 to skip captureStacktrace and runtime.Callers. + numFrames := runtime.Callers( + skip+2, + stack.pcs, + ) - // Note: On the last iteration, frames.Next() returns false, with a valid - // frame, but we ignore this frame. The last frame is a a runtime frame which - // adds noise, since it's only either runtime.main or runtime.goexit. - for frame, more := frames.Next(); more; frame, more = frames.Next() { - if i != 0 { - buffer.AppendByte('\n') + // runtime.Callers truncates the recorded stacktrace if there is no + // room in the provided slice. For the full stack trace, keep expanding + // storage until there are fewer frames than there is room. + if depth == stacktraceFull { + pcs := stack.pcs + for numFrames == len(pcs) { + pcs = make([]uintptr, len(pcs)*2) + numFrames = runtime.Callers(skip+2, pcs) } - i++ - buffer.AppendString(frame.Function) - buffer.AppendByte('\n') - buffer.AppendByte('\t') - buffer.AppendString(frame.File) - buffer.AppendByte(':') - buffer.AppendInt(int64(frame.Line)) + + // Discard old storage instead of returning it to the pool. + // This will adjust the pool size over time if stack traces are + // consistently very deep. + stack.storage = pcs + stack.pcs = pcs[:numFrames] + } else { + stack.pcs = stack.pcs[:numFrames] } + stack.frames = runtime.CallersFrames(stack.pcs) + return stack +} + +// Free releases resources associated with this stacktrace +// and returns it back to the pool. +func (st *stacktrace) Free() { + st.frames = nil + st.pcs = nil + _stacktracePool.Put(st) +} + +// Count reports the total number of frames in this stacktrace. +// Count DOES NOT change as Next is called. +func (st *stacktrace) Count() int { + return len(st.pcs) +} + +// Next returns the next frame in the stack trace, +// and a boolean indicating whether there are more after it. +func (st *stacktrace) Next() (_ runtime.Frame, more bool) { + return st.frames.Next() +} + +func takeStacktrace(skip int) string { + stack := captureStacktrace(skip+1, stacktraceFull) + defer stack.Free() + + buffer := bufferpool.Get() + defer buffer.Free() + + stackfmt := newStackFormatter(buffer) + stackfmt.FormatStack(stack) return buffer.String() } -type programCounters struct { - pcs []uintptr +// stackFormatter formats a stack trace into a readable string representation. +type stackFormatter struct { + b *buffer.Buffer + nonEmpty bool // whehther we've written at least one frame already +} + +// newStackFormatter builds a new stackFormatter. +func newStackFormatter(b *buffer.Buffer) stackFormatter { + return stackFormatter{b: b} } -func newProgramCounters(size int) *programCounters { - return &programCounters{make([]uintptr, size)} +// FormatStack formats all remaining frames in the provided stacktrace -- minus +// the final runtime.main/runtime.goexit frame. +func (sf *stackFormatter) FormatStack(stack *stacktrace) { + // Note: On the last iteration, frames.Next() returns false, with a valid + // frame, but we ignore this frame. The last frame is a runtime frame which + // adds noise, since it's only either runtime.main or runtime.goexit. + for frame, more := stack.Next(); more; frame, more = stack.Next() { + sf.FormatFrame(frame) + } +} + +// FormatFrame formats the given frame. +func (sf *stackFormatter) FormatFrame(frame runtime.Frame) { + if sf.nonEmpty { + sf.b.AppendByte('\n') + } + sf.nonEmpty = true + sf.b.AppendString(frame.Function) + sf.b.AppendByte('\n') + sf.b.AppendByte('\t') + sf.b.AppendString(frame.File) + sf.b.AppendByte(':') + sf.b.AppendInt(int64(frame.Line)) } diff --git a/vendor/go.uber.org/zap/sugar.go b/vendor/go.uber.org/zap/sugar.go index 0b9651981a90..ac387b3e47d1 100644 --- a/vendor/go.uber.org/zap/sugar.go +++ b/vendor/go.uber.org/zap/sugar.go @@ -31,6 +31,7 @@ import ( const ( _oddNumberErrMsg = "Ignored key without a value." _nonStringKeyErrMsg = "Ignored key-value pairs with non-string keys." + _multipleErrMsg = "Multiple errors without a key." ) // A SugaredLogger wraps the base Logger functionality in a slower, but less @@ -38,10 +39,19 @@ const ( // method. // // Unlike the Logger, the SugaredLogger doesn't insist on structured logging. -// For each log level, it exposes three methods: one for loosely-typed -// structured logging, one for println-style formatting, and one for -// printf-style formatting. For example, SugaredLoggers can produce InfoLevel -// output with Infow ("info with" structured context), Info, or Infof. +// For each log level, it exposes four methods: +// +// - methods named after the log level for log.Print-style logging +// - methods ending in "w" for loosely-typed structured logging +// - methods ending in "f" for log.Printf-style logging +// - methods ending in "ln" for log.Println-style logging +// +// For example, the methods for InfoLevel are: +// +// Info(...any) Print-style logging +// Infow(...any) Structured logging (read as "info with") +// Infof(string, ...any) Printf-style logging +// Infoln(...any) Println-style logging type SugaredLogger struct { base *Logger } @@ -61,27 +71,40 @@ func (s *SugaredLogger) Named(name string) *SugaredLogger { return &SugaredLogger{base: s.base.Named(name)} } +// WithOptions clones the current SugaredLogger, applies the supplied Options, +// and returns the result. It's safe to use concurrently. +func (s *SugaredLogger) WithOptions(opts ...Option) *SugaredLogger { + base := s.base.clone() + for _, opt := range opts { + opt.apply(base) + } + return &SugaredLogger{base: base} +} + // With adds a variadic number of fields to the logging context. It accepts a // mix of strongly-typed Field objects and loosely-typed key-value pairs. When // processing pairs, the first element of the pair is used as the field key // and the second as the field value. // // For example, -// sugaredLogger.With( -// "hello", "world", -// "failure", errors.New("oh no"), -// Stack(), -// "count", 42, -// "user", User{Name: "alice"}, -// ) +// +// sugaredLogger.With( +// "hello", "world", +// "failure", errors.New("oh no"), +// Stack(), +// "count", 42, +// "user", User{Name: "alice"}, +// ) +// // is the equivalent of -// unsugared.With( -// String("hello", "world"), -// String("failure", "oh no"), -// Stack(), -// Int("count", 42), -// Object("user", User{Name: "alice"}), -// ) +// +// unsugared.With( +// String("hello", "world"), +// String("failure", "oh no"), +// Stack(), +// Int("count", 42), +// Object("user", User{Name: "alice"}), +// ) // // Note that the keys in key-value pairs should be strings. In development, // passing a non-string key panics. In production, the logger is more @@ -92,6 +115,13 @@ func (s *SugaredLogger) With(args ...interface{}) *SugaredLogger { return &SugaredLogger{base: s.base.With(s.sweetenFields(args)...)} } +// Level reports the minimum enabled level for this logger. +// +// For NopLoggers, this is [zapcore.InvalidLevel]. +func (s *SugaredLogger) Level() zapcore.Level { + return zapcore.LevelOf(s.base.core) +} + // Debug uses fmt.Sprint to construct and log a message. func (s *SugaredLogger) Debug(args ...interface{}) { s.log(DebugLevel, "", args, nil) @@ -168,7 +198,8 @@ func (s *SugaredLogger) Fatalf(template string, args ...interface{}) { // pairs are treated as they are in With. // // When debug-level logging is disabled, this is much faster than -// s.With(keysAndValues).Debug(msg) +// +// s.With(keysAndValues).Debug(msg) func (s *SugaredLogger) Debugw(msg string, keysAndValues ...interface{}) { s.log(DebugLevel, msg, nil, keysAndValues) } @@ -210,11 +241,48 @@ func (s *SugaredLogger) Fatalw(msg string, keysAndValues ...interface{}) { s.log(FatalLevel, msg, nil, keysAndValues) } +// Debugln uses fmt.Sprintln to construct and log a message. +func (s *SugaredLogger) Debugln(args ...interface{}) { + s.logln(DebugLevel, args, nil) +} + +// Infoln uses fmt.Sprintln to construct and log a message. +func (s *SugaredLogger) Infoln(args ...interface{}) { + s.logln(InfoLevel, args, nil) +} + +// Warnln uses fmt.Sprintln to construct and log a message. +func (s *SugaredLogger) Warnln(args ...interface{}) { + s.logln(WarnLevel, args, nil) +} + +// Errorln uses fmt.Sprintln to construct and log a message. +func (s *SugaredLogger) Errorln(args ...interface{}) { + s.logln(ErrorLevel, args, nil) +} + +// DPanicln uses fmt.Sprintln to construct and log a message. In development, the +// logger then panics. (See DPanicLevel for details.) +func (s *SugaredLogger) DPanicln(args ...interface{}) { + s.logln(DPanicLevel, args, nil) +} + +// Panicln uses fmt.Sprintln to construct and log a message, then panics. +func (s *SugaredLogger) Panicln(args ...interface{}) { + s.logln(PanicLevel, args, nil) +} + +// Fatalln uses fmt.Sprintln to construct and log a message, then calls os.Exit. +func (s *SugaredLogger) Fatalln(args ...interface{}) { + s.logln(FatalLevel, args, nil) +} + // Sync flushes any buffered log entries. func (s *SugaredLogger) Sync() error { return s.base.Sync() } +// log message with Sprint, Sprintf, or neither. func (s *SugaredLogger) log(lvl zapcore.Level, template string, fmtArgs []interface{}, context []interface{}) { // If logging at this level is completely disabled, skip the overhead of // string formatting. @@ -228,6 +296,18 @@ func (s *SugaredLogger) log(lvl zapcore.Level, template string, fmtArgs []interf } } +// logln message with Sprintln +func (s *SugaredLogger) logln(lvl zapcore.Level, fmtArgs []interface{}, context []interface{}) { + if lvl < DPanicLevel && !s.base.Core().Enabled(lvl) { + return + } + + msg := getMessageln(fmtArgs) + if ce := s.base.Check(lvl, msg); ce != nil { + ce.Write(s.sweetenFields(context)...) + } +} + // getMessage format with Sprint, Sprintf, or neither. func getMessage(template string, fmtArgs []interface{}) string { if len(fmtArgs) == 0 { @@ -246,15 +326,24 @@ func getMessage(template string, fmtArgs []interface{}) string { return fmt.Sprint(fmtArgs...) } +// getMessageln format with Sprintln. +func getMessageln(fmtArgs []interface{}) string { + msg := fmt.Sprintln(fmtArgs...) + return msg[:len(msg)-1] +} + func (s *SugaredLogger) sweetenFields(args []interface{}) []Field { if len(args) == 0 { return nil } - // Allocate enough space for the worst case; if users pass only structured - // fields, we shouldn't penalize them with extra allocations. - fields := make([]Field, 0, len(args)) - var invalid invalidPairs + var ( + // Allocate enough space for the worst case; if users pass only structured + // fields, we shouldn't penalize them with extra allocations. + fields = make([]Field, 0, len(args)) + invalid invalidPairs + seenError bool + ) for i := 0; i < len(args); { // This is a strongly-typed field. Consume it and move on. @@ -264,6 +353,18 @@ func (s *SugaredLogger) sweetenFields(args []interface{}) []Field { continue } + // If it is an error, consume it and move on. + if err, ok := args[i].(error); ok { + if !seenError { + seenError = true + fields = append(fields, Error(err)) + } else { + s.base.Error(_multipleErrMsg, Error(err)) + } + i++ + continue + } + // Make sure this element isn't a dangling key. if i == len(args)-1 { s.base.Error(_oddNumberErrMsg, Any("ignored", args[i])) diff --git a/vendor/go.uber.org/zap/writer.go b/vendor/go.uber.org/zap/writer.go index 86a709ab0be2..f08728e1ec00 100644 --- a/vendor/go.uber.org/zap/writer.go +++ b/vendor/go.uber.org/zap/writer.go @@ -1,4 +1,4 @@ -// Copyright (c) 2016 Uber Technologies, Inc. +// Copyright (c) 2016-2022 Uber Technologies, Inc. // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal @@ -23,7 +23,6 @@ package zap import ( "fmt" "io" - "io/ioutil" "go.uber.org/zap/zapcore" @@ -69,9 +68,9 @@ func open(paths []string) ([]zapcore.WriteSyncer, func(), error) { var openErr error for _, path := range paths { - sink, err := newSink(path) + sink, err := _sinkRegistry.newSink(path) if err != nil { - openErr = multierr.Append(openErr, fmt.Errorf("couldn't open sink %q: %v", path, err)) + openErr = multierr.Append(openErr, fmt.Errorf("open sink %q: %w", path, err)) continue } writers = append(writers, sink) @@ -79,7 +78,7 @@ func open(paths []string) ([]zapcore.WriteSyncer, func(), error) { } if openErr != nil { close() - return writers, nil, openErr + return nil, nil, openErr } return writers, close, nil @@ -93,7 +92,7 @@ func open(paths []string) ([]zapcore.WriteSyncer, func(), error) { // using zapcore.NewMultiWriteSyncer and zapcore.Lock individually. func CombineWriteSyncers(writers ...zapcore.WriteSyncer) zapcore.WriteSyncer { if len(writers) == 0 { - return zapcore.AddSync(ioutil.Discard) + return zapcore.AddSync(io.Discard) } return zapcore.Lock(zapcore.NewMultiWriteSyncer(writers...)) } diff --git a/vendor/go.uber.org/zap/zapcore/buffered_write_syncer.go b/vendor/go.uber.org/zap/zapcore/buffered_write_syncer.go index ef2f7d9637bc..a40e93b3ec8f 100644 --- a/vendor/go.uber.org/zap/zapcore/buffered_write_syncer.go +++ b/vendor/go.uber.org/zap/zapcore/buffered_write_syncer.go @@ -43,6 +43,37 @@ const ( // // BufferedWriteSyncer is safe for concurrent use. You don't need to use // zapcore.Lock for WriteSyncers with BufferedWriteSyncer. +// +// To set up a BufferedWriteSyncer, construct a WriteSyncer for your log +// destination (*os.File is a valid WriteSyncer), wrap it with +// BufferedWriteSyncer, and defer a Stop() call for when you no longer need the +// object. +// +// func main() { +// ws := ... // your log destination +// bws := &zapcore.BufferedWriteSyncer{WS: ws} +// defer bws.Stop() +// +// // ... +// core := zapcore.NewCore(enc, bws, lvl) +// logger := zap.New(core) +// +// // ... +// } +// +// By default, a BufferedWriteSyncer will buffer up to 256 kilobytes of logs, +// waiting at most 30 seconds between flushes. +// You can customize these parameters by setting the Size or FlushInterval +// fields. +// For example, the following buffers up to 512 kB of logs before flushing them +// to Stderr, with a maximum of one minute between each flush. +// +// ws := &BufferedWriteSyncer{ +// WS: os.Stderr, +// Size: 512 * 1024, // 512 kB +// FlushInterval: time.Minute, +// } +// defer ws.Stop() type BufferedWriteSyncer struct { // WS is the WriteSyncer around which BufferedWriteSyncer will buffer // writes. diff --git a/vendor/go.uber.org/zap/zapcore/clock.go b/vendor/go.uber.org/zap/zapcore/clock.go index d2ea95b394bc..422fd82a6b0f 100644 --- a/vendor/go.uber.org/zap/zapcore/clock.go +++ b/vendor/go.uber.org/zap/zapcore/clock.go @@ -20,9 +20,7 @@ package zapcore -import ( - "time" -) +import "time" // DefaultClock is the default clock used by Zap in operations that require // time. This clock uses the system clock for all operations. diff --git a/vendor/go.uber.org/zap/zapcore/console_encoder.go b/vendor/go.uber.org/zap/zapcore/console_encoder.go index 2307af404c5e..1aa5dc364673 100644 --- a/vendor/go.uber.org/zap/zapcore/console_encoder.go +++ b/vendor/go.uber.org/zap/zapcore/console_encoder.go @@ -125,11 +125,7 @@ func (c consoleEncoder) EncodeEntry(ent Entry, fields []Field) (*buffer.Buffer, line.AppendString(ent.Stack) } - if c.LineEnding != "" { - line.AppendString(c.LineEnding) - } else { - line.AppendString(DefaultLineEnding) - } + line.AppendString(c.LineEnding) return line, nil } diff --git a/vendor/go.uber.org/zap/zapcore/core.go b/vendor/go.uber.org/zap/zapcore/core.go index a1ef8b034bb4..9dfd64051f04 100644 --- a/vendor/go.uber.org/zap/zapcore/core.go +++ b/vendor/go.uber.org/zap/zapcore/core.go @@ -69,6 +69,15 @@ type ioCore struct { out WriteSyncer } +var ( + _ Core = (*ioCore)(nil) + _ leveledEnabler = (*ioCore)(nil) +) + +func (c *ioCore) Level() Level { + return LevelOf(c.LevelEnabler) +} + func (c *ioCore) With(fields []Field) Core { clone := c.clone() addFields(clone.enc, fields) diff --git a/vendor/go.uber.org/zap/zapcore/encoder.go b/vendor/go.uber.org/zap/zapcore/encoder.go index 6601ca166c64..5769ff3e4e56 100644 --- a/vendor/go.uber.org/zap/zapcore/encoder.go +++ b/vendor/go.uber.org/zap/zapcore/encoder.go @@ -22,6 +22,7 @@ package zapcore import ( "encoding/json" + "io" "time" "go.uber.org/zap/buffer" @@ -187,10 +188,13 @@ func (e *TimeEncoder) UnmarshalText(text []byte) error { // UnmarshalYAML unmarshals YAML to a TimeEncoder. // If value is an object with a "layout" field, it will be unmarshaled to TimeEncoder with given layout. -// timeEncoder: -// layout: 06/01/02 03:04pm +// +// timeEncoder: +// layout: 06/01/02 03:04pm +// // If value is string, it uses UnmarshalText. -// timeEncoder: iso8601 +// +// timeEncoder: iso8601 func (e *TimeEncoder) UnmarshalYAML(unmarshal func(interface{}) error) error { var o struct { Layout string `json:"layout" yaml:"layout"` @@ -312,14 +316,15 @@ func (e *NameEncoder) UnmarshalText(text []byte) error { type EncoderConfig struct { // Set the keys used for each log entry. If any key is empty, that portion // of the entry is omitted. - MessageKey string `json:"messageKey" yaml:"messageKey"` - LevelKey string `json:"levelKey" yaml:"levelKey"` - TimeKey string `json:"timeKey" yaml:"timeKey"` - NameKey string `json:"nameKey" yaml:"nameKey"` - CallerKey string `json:"callerKey" yaml:"callerKey"` - FunctionKey string `json:"functionKey" yaml:"functionKey"` - StacktraceKey string `json:"stacktraceKey" yaml:"stacktraceKey"` - LineEnding string `json:"lineEnding" yaml:"lineEnding"` + MessageKey string `json:"messageKey" yaml:"messageKey"` + LevelKey string `json:"levelKey" yaml:"levelKey"` + TimeKey string `json:"timeKey" yaml:"timeKey"` + NameKey string `json:"nameKey" yaml:"nameKey"` + CallerKey string `json:"callerKey" yaml:"callerKey"` + FunctionKey string `json:"functionKey" yaml:"functionKey"` + StacktraceKey string `json:"stacktraceKey" yaml:"stacktraceKey"` + SkipLineEnding bool `json:"skipLineEnding" yaml:"skipLineEnding"` + LineEnding string `json:"lineEnding" yaml:"lineEnding"` // Configure the primitive representations of common complex types. For // example, some users may want all time.Times serialized as floating-point // seconds since epoch, while others may prefer ISO8601 strings. @@ -330,6 +335,9 @@ type EncoderConfig struct { // Unlike the other primitive type encoders, EncodeName is optional. The // zero value falls back to FullNameEncoder. EncodeName NameEncoder `json:"nameEncoder" yaml:"nameEncoder"` + // Configure the encoder for interface{} type objects. + // If not provided, objects are encoded using json.Encoder + NewReflectedEncoder func(io.Writer) ReflectedEncoder `json:"-" yaml:"-"` // Configures the field separator used by the console encoder. Defaults // to tab. ConsoleSeparator string `json:"consoleSeparator" yaml:"consoleSeparator"` diff --git a/vendor/go.uber.org/zap/zapcore/entry.go b/vendor/go.uber.org/zap/zapcore/entry.go index 0885505b75bc..9d326e95ea25 100644 --- a/vendor/go.uber.org/zap/zapcore/entry.go +++ b/vendor/go.uber.org/zap/zapcore/entry.go @@ -27,10 +27,9 @@ import ( "sync" "time" + "go.uber.org/multierr" "go.uber.org/zap/internal/bufferpool" "go.uber.org/zap/internal/exit" - - "go.uber.org/multierr" ) var ( @@ -152,6 +151,27 @@ type Entry struct { Stack string } +// CheckWriteHook is a custom action that may be executed after an entry is +// written. +// +// Register one on a CheckedEntry with the After method. +// +// if ce := logger.Check(...); ce != nil { +// ce = ce.After(hook) +// ce.Write(...) +// } +// +// You can configure the hook for Fatal log statements at the logger level with +// the zap.WithFatalHook option. +type CheckWriteHook interface { + // OnWrite is invoked with the CheckedEntry that was written and a list + // of fields added with that entry. + // + // The list of fields DOES NOT include fields that were already added + // to the logger with the With method. + OnWrite(*CheckedEntry, []Field) +} + // CheckWriteAction indicates what action to take after a log entry is // processed. Actions are ordered in increasing severity. type CheckWriteAction uint8 @@ -164,21 +184,36 @@ const ( WriteThenGoexit // WriteThenPanic causes a panic after Write. WriteThenPanic - // WriteThenFatal causes a fatal os.Exit after Write. + // WriteThenFatal causes an os.Exit(1) after Write. WriteThenFatal ) +// OnWrite implements the OnWrite method to keep CheckWriteAction compatible +// with the new CheckWriteHook interface which deprecates CheckWriteAction. +func (a CheckWriteAction) OnWrite(ce *CheckedEntry, _ []Field) { + switch a { + case WriteThenGoexit: + runtime.Goexit() + case WriteThenPanic: + panic(ce.Message) + case WriteThenFatal: + exit.With(1) + } +} + +var _ CheckWriteHook = CheckWriteAction(0) + // CheckedEntry is an Entry together with a collection of Cores that have // already agreed to log it. // -// CheckedEntry references should be created by calling AddCore or Should on a +// CheckedEntry references should be created by calling AddCore or After on a // nil *CheckedEntry. References are returned to a pool after Write, and MUST // NOT be retained after calling their Write method. type CheckedEntry struct { Entry ErrorOutput WriteSyncer dirty bool // best-effort detection of pool misuse - should CheckWriteAction + after CheckWriteHook cores []Core } @@ -186,7 +221,7 @@ func (ce *CheckedEntry) reset() { ce.Entry = Entry{} ce.ErrorOutput = nil ce.dirty = false - ce.should = WriteThenNoop + ce.after = nil for i := range ce.cores { // don't keep references to cores ce.cores[i] = nil @@ -224,17 +259,11 @@ func (ce *CheckedEntry) Write(fields ...Field) { ce.ErrorOutput.Sync() } - should, msg := ce.should, ce.Message - putCheckedEntry(ce) - - switch should { - case WriteThenPanic: - panic(msg) - case WriteThenFatal: - exit.Exit() - case WriteThenGoexit: - runtime.Goexit() + hook := ce.after + if hook != nil { + hook.OnWrite(ce, fields) } + putCheckedEntry(ce) } // AddCore adds a Core that has agreed to log this CheckedEntry. It's intended to be @@ -252,11 +281,20 @@ func (ce *CheckedEntry) AddCore(ent Entry, core Core) *CheckedEntry { // Should sets this CheckedEntry's CheckWriteAction, which controls whether a // Core will panic or fatal after writing this log entry. Like AddCore, it's // safe to call on nil CheckedEntry references. +// +// Deprecated: Use [CheckedEntry.After] instead. func (ce *CheckedEntry) Should(ent Entry, should CheckWriteAction) *CheckedEntry { + return ce.After(ent, should) +} + +// After sets this CheckEntry's CheckWriteHook, which will be called after this +// log entry has been written. It's safe to call this on nil CheckedEntry +// references. +func (ce *CheckedEntry) After(ent Entry, hook CheckWriteHook) *CheckedEntry { if ce == nil { ce = getCheckedEntry() ce.Entry = ent } - ce.should = should + ce.after = hook return ce } diff --git a/vendor/go.uber.org/zap/zapcore/error.go b/vendor/go.uber.org/zap/zapcore/error.go index 74919b0ccb1b..06359907af41 100644 --- a/vendor/go.uber.org/zap/zapcore/error.go +++ b/vendor/go.uber.org/zap/zapcore/error.go @@ -36,13 +36,13 @@ import ( // causer (from github.com/pkg/errors), a ${key}Causes field is added with an // array of objects containing the errors this error was comprised of. // -// { -// "error": err.Error(), -// "errorVerbose": fmt.Sprintf("%+v", err), -// "errorCauses": [ -// ... -// ], -// } +// { +// "error": err.Error(), +// "errorVerbose": fmt.Sprintf("%+v", err), +// "errorCauses": [ +// ... +// ], +// } func encodeError(key string, err error, enc ObjectEncoder) (retErr error) { // Try to capture panics (from nil references or otherwise) when calling // the Error() method diff --git a/vendor/go.uber.org/zap/zapcore/hook.go b/vendor/go.uber.org/zap/zapcore/hook.go index 5db4afb302b3..198def9917ce 100644 --- a/vendor/go.uber.org/zap/zapcore/hook.go +++ b/vendor/go.uber.org/zap/zapcore/hook.go @@ -27,6 +27,11 @@ type hooked struct { funcs []func(Entry) error } +var ( + _ Core = (*hooked)(nil) + _ leveledEnabler = (*hooked)(nil) +) + // RegisterHooks wraps a Core and runs a collection of user-defined callback // hooks each time a message is logged. Execution of the callbacks is blocking. // @@ -40,6 +45,10 @@ func RegisterHooks(core Core, hooks ...func(Entry) error) Core { } } +func (h *hooked) Level() Level { + return LevelOf(h.Core) +} + func (h *hooked) Check(ent Entry, ce *CheckedEntry) *CheckedEntry { // Let the wrapped Core decide whether to log this message or not. This // also gives the downstream a chance to register itself directly with the diff --git a/vendor/go.uber.org/zap/zapcore/increase_level.go b/vendor/go.uber.org/zap/zapcore/increase_level.go index 5a1749261ab2..7a11237ae976 100644 --- a/vendor/go.uber.org/zap/zapcore/increase_level.go +++ b/vendor/go.uber.org/zap/zapcore/increase_level.go @@ -27,6 +27,11 @@ type levelFilterCore struct { level LevelEnabler } +var ( + _ Core = (*levelFilterCore)(nil) + _ leveledEnabler = (*levelFilterCore)(nil) +) + // NewIncreaseLevelCore creates a core that can be used to increase the level of // an existing Core. It cannot be used to decrease the logging level, as it acts // as a filter before calling the underlying core. If level decreases the log level, @@ -45,6 +50,10 @@ func (c *levelFilterCore) Enabled(lvl Level) bool { return c.level.Enabled(lvl) } +func (c *levelFilterCore) Level() Level { + return LevelOf(c.level) +} + func (c *levelFilterCore) With(fields []Field) Core { return &levelFilterCore{c.core.With(fields), c.level} } diff --git a/vendor/go.uber.org/zap/zapcore/json_encoder.go b/vendor/go.uber.org/zap/zapcore/json_encoder.go index af220d9b4d79..3921c5cd333e 100644 --- a/vendor/go.uber.org/zap/zapcore/json_encoder.go +++ b/vendor/go.uber.org/zap/zapcore/json_encoder.go @@ -22,7 +22,6 @@ package zapcore import ( "encoding/base64" - "encoding/json" "math" "sync" "time" @@ -64,7 +63,7 @@ type jsonEncoder struct { // for encoding generic values by reflection reflectBuf *buffer.Buffer - reflectEnc *json.Encoder + reflectEnc ReflectedEncoder } // NewJSONEncoder creates a fast, low-allocation JSON encoder. The encoder @@ -72,7 +71,9 @@ type jsonEncoder struct { // // Note that the encoder doesn't deduplicate keys, so it's possible to produce // a message like -// {"foo":"bar","foo":"baz"} +// +// {"foo":"bar","foo":"baz"} +// // This is permitted by the JSON specification, but not encouraged. Many // libraries will ignore duplicate key-value pairs (typically keeping the last // pair) when unmarshaling, but users should attempt to avoid adding duplicate @@ -82,6 +83,17 @@ func NewJSONEncoder(cfg EncoderConfig) Encoder { } func newJSONEncoder(cfg EncoderConfig, spaced bool) *jsonEncoder { + if cfg.SkipLineEnding { + cfg.LineEnding = "" + } else if cfg.LineEnding == "" { + cfg.LineEnding = DefaultLineEnding + } + + // If no EncoderConfig.NewReflectedEncoder is provided by the user, then use default + if cfg.NewReflectedEncoder == nil { + cfg.NewReflectedEncoder = defaultReflectedEncoder + } + return &jsonEncoder{ EncoderConfig: &cfg, buf: bufferpool.Get(), @@ -118,6 +130,11 @@ func (enc *jsonEncoder) AddComplex128(key string, val complex128) { enc.AppendComplex128(val) } +func (enc *jsonEncoder) AddComplex64(key string, val complex64) { + enc.addKey(key) + enc.AppendComplex64(val) +} + func (enc *jsonEncoder) AddDuration(key string, val time.Duration) { enc.addKey(key) enc.AppendDuration(val) @@ -141,10 +158,7 @@ func (enc *jsonEncoder) AddInt64(key string, val int64) { func (enc *jsonEncoder) resetReflectBuf() { if enc.reflectBuf == nil { enc.reflectBuf = bufferpool.Get() - enc.reflectEnc = json.NewEncoder(enc.reflectBuf) - - // For consistency with our custom JSON encoder. - enc.reflectEnc.SetEscapeHTML(false) + enc.reflectEnc = enc.NewReflectedEncoder(enc.reflectBuf) } else { enc.reflectBuf.Reset() } @@ -206,10 +220,16 @@ func (enc *jsonEncoder) AppendArray(arr ArrayMarshaler) error { } func (enc *jsonEncoder) AppendObject(obj ObjectMarshaler) error { + // Close ONLY new openNamespaces that are created during + // AppendObject(). + old := enc.openNamespaces + enc.openNamespaces = 0 enc.addElementSeparator() enc.buf.AppendByte('{') err := obj.MarshalLogObject(enc) enc.buf.AppendByte('}') + enc.closeOpenNamespaces() + enc.openNamespaces = old return err } @@ -225,20 +245,23 @@ func (enc *jsonEncoder) AppendByteString(val []byte) { enc.buf.AppendByte('"') } -func (enc *jsonEncoder) AppendComplex128(val complex128) { +// appendComplex appends the encoded form of the provided complex128 value. +// precision specifies the encoding precision for the real and imaginary +// components of the complex number. +func (enc *jsonEncoder) appendComplex(val complex128, precision int) { enc.addElementSeparator() // Cast to a platform-independent, fixed-size type. r, i := float64(real(val)), float64(imag(val)) enc.buf.AppendByte('"') // Because we're always in a quoted string, we can use strconv without // special-casing NaN and +/-Inf. - enc.buf.AppendFloat(r, 64) + enc.buf.AppendFloat(r, precision) // If imaginary part is less than 0, minus (-) sign is added by default // by AppendFloat. if i >= 0 { enc.buf.AppendByte('+') } - enc.buf.AppendFloat(i, 64) + enc.buf.AppendFloat(i, precision) enc.buf.AppendByte('i') enc.buf.AppendByte('"') } @@ -301,28 +324,28 @@ func (enc *jsonEncoder) AppendUint64(val uint64) { enc.buf.AppendUint(val) } -func (enc *jsonEncoder) AddComplex64(k string, v complex64) { enc.AddComplex128(k, complex128(v)) } -func (enc *jsonEncoder) AddInt(k string, v int) { enc.AddInt64(k, int64(v)) } -func (enc *jsonEncoder) AddInt32(k string, v int32) { enc.AddInt64(k, int64(v)) } -func (enc *jsonEncoder) AddInt16(k string, v int16) { enc.AddInt64(k, int64(v)) } -func (enc *jsonEncoder) AddInt8(k string, v int8) { enc.AddInt64(k, int64(v)) } -func (enc *jsonEncoder) AddUint(k string, v uint) { enc.AddUint64(k, uint64(v)) } -func (enc *jsonEncoder) AddUint32(k string, v uint32) { enc.AddUint64(k, uint64(v)) } -func (enc *jsonEncoder) AddUint16(k string, v uint16) { enc.AddUint64(k, uint64(v)) } -func (enc *jsonEncoder) AddUint8(k string, v uint8) { enc.AddUint64(k, uint64(v)) } -func (enc *jsonEncoder) AddUintptr(k string, v uintptr) { enc.AddUint64(k, uint64(v)) } -func (enc *jsonEncoder) AppendComplex64(v complex64) { enc.AppendComplex128(complex128(v)) } -func (enc *jsonEncoder) AppendFloat64(v float64) { enc.appendFloat(v, 64) } -func (enc *jsonEncoder) AppendFloat32(v float32) { enc.appendFloat(float64(v), 32) } -func (enc *jsonEncoder) AppendInt(v int) { enc.AppendInt64(int64(v)) } -func (enc *jsonEncoder) AppendInt32(v int32) { enc.AppendInt64(int64(v)) } -func (enc *jsonEncoder) AppendInt16(v int16) { enc.AppendInt64(int64(v)) } -func (enc *jsonEncoder) AppendInt8(v int8) { enc.AppendInt64(int64(v)) } -func (enc *jsonEncoder) AppendUint(v uint) { enc.AppendUint64(uint64(v)) } -func (enc *jsonEncoder) AppendUint32(v uint32) { enc.AppendUint64(uint64(v)) } -func (enc *jsonEncoder) AppendUint16(v uint16) { enc.AppendUint64(uint64(v)) } -func (enc *jsonEncoder) AppendUint8(v uint8) { enc.AppendUint64(uint64(v)) } -func (enc *jsonEncoder) AppendUintptr(v uintptr) { enc.AppendUint64(uint64(v)) } +func (enc *jsonEncoder) AddInt(k string, v int) { enc.AddInt64(k, int64(v)) } +func (enc *jsonEncoder) AddInt32(k string, v int32) { enc.AddInt64(k, int64(v)) } +func (enc *jsonEncoder) AddInt16(k string, v int16) { enc.AddInt64(k, int64(v)) } +func (enc *jsonEncoder) AddInt8(k string, v int8) { enc.AddInt64(k, int64(v)) } +func (enc *jsonEncoder) AddUint(k string, v uint) { enc.AddUint64(k, uint64(v)) } +func (enc *jsonEncoder) AddUint32(k string, v uint32) { enc.AddUint64(k, uint64(v)) } +func (enc *jsonEncoder) AddUint16(k string, v uint16) { enc.AddUint64(k, uint64(v)) } +func (enc *jsonEncoder) AddUint8(k string, v uint8) { enc.AddUint64(k, uint64(v)) } +func (enc *jsonEncoder) AddUintptr(k string, v uintptr) { enc.AddUint64(k, uint64(v)) } +func (enc *jsonEncoder) AppendComplex64(v complex64) { enc.appendComplex(complex128(v), 32) } +func (enc *jsonEncoder) AppendComplex128(v complex128) { enc.appendComplex(complex128(v), 64) } +func (enc *jsonEncoder) AppendFloat64(v float64) { enc.appendFloat(v, 64) } +func (enc *jsonEncoder) AppendFloat32(v float32) { enc.appendFloat(float64(v), 32) } +func (enc *jsonEncoder) AppendInt(v int) { enc.AppendInt64(int64(v)) } +func (enc *jsonEncoder) AppendInt32(v int32) { enc.AppendInt64(int64(v)) } +func (enc *jsonEncoder) AppendInt16(v int16) { enc.AppendInt64(int64(v)) } +func (enc *jsonEncoder) AppendInt8(v int8) { enc.AppendInt64(int64(v)) } +func (enc *jsonEncoder) AppendUint(v uint) { enc.AppendUint64(uint64(v)) } +func (enc *jsonEncoder) AppendUint32(v uint32) { enc.AppendUint64(uint64(v)) } +func (enc *jsonEncoder) AppendUint16(v uint16) { enc.AppendUint64(uint64(v)) } +func (enc *jsonEncoder) AppendUint8(v uint8) { enc.AppendUint64(uint64(v)) } +func (enc *jsonEncoder) AppendUintptr(v uintptr) { enc.AppendUint64(uint64(v)) } func (enc *jsonEncoder) Clone() Encoder { clone := enc.clone() @@ -343,7 +366,7 @@ func (enc *jsonEncoder) EncodeEntry(ent Entry, fields []Field) (*buffer.Buffer, final := enc.clone() final.buf.AppendByte('{') - if final.LevelKey != "" { + if final.LevelKey != "" && final.EncodeLevel != nil { final.addKey(final.LevelKey) cur := final.buf.Len() final.EncodeLevel(ent.Level, final) @@ -404,11 +427,7 @@ func (enc *jsonEncoder) EncodeEntry(ent Entry, fields []Field) (*buffer.Buffer, final.AddString(final.StacktraceKey, ent.Stack) } final.buf.AppendByte('}') - if final.LineEnding != "" { - final.buf.AppendString(final.LineEnding) - } else { - final.buf.AppendString(DefaultLineEnding) - } + final.buf.AppendString(final.LineEnding) ret := final.buf putJSONEncoder(final) @@ -423,6 +442,7 @@ func (enc *jsonEncoder) closeOpenNamespaces() { for i := 0; i < enc.openNamespaces; i++ { enc.buf.AppendByte('}') } + enc.openNamespaces = 0 } func (enc *jsonEncoder) addKey(key string) { diff --git a/vendor/go.uber.org/zap/zapcore/level.go b/vendor/go.uber.org/zap/zapcore/level.go index e575c9f432c2..e01a2413166d 100644 --- a/vendor/go.uber.org/zap/zapcore/level.go +++ b/vendor/go.uber.org/zap/zapcore/level.go @@ -53,8 +53,62 @@ const ( _minLevel = DebugLevel _maxLevel = FatalLevel + + // InvalidLevel is an invalid value for Level. + // + // Core implementations may panic if they see messages of this level. + InvalidLevel = _maxLevel + 1 ) +// ParseLevel parses a level based on the lower-case or all-caps ASCII +// representation of the log level. If the provided ASCII representation is +// invalid an error is returned. +// +// This is particularly useful when dealing with text input to configure log +// levels. +func ParseLevel(text string) (Level, error) { + var level Level + err := level.UnmarshalText([]byte(text)) + return level, err +} + +type leveledEnabler interface { + LevelEnabler + + Level() Level +} + +// LevelOf reports the minimum enabled log level for the given LevelEnabler +// from Zap's supported log levels, or [InvalidLevel] if none of them are +// enabled. +// +// A LevelEnabler may implement a 'Level() Level' method to override the +// behavior of this function. +// +// func (c *core) Level() Level { +// return c.currentLevel +// } +// +// It is recommended that [Core] implementations that wrap other cores use +// LevelOf to retrieve the level of the wrapped core. For example, +// +// func (c *coreWrapper) Level() Level { +// return zapcore.LevelOf(c.wrappedCore) +// } +func LevelOf(enab LevelEnabler) Level { + if lvler, ok := enab.(leveledEnabler); ok { + return lvler.Level() + } + + for lvl := _minLevel; lvl <= _maxLevel; lvl++ { + if enab.Enabled(lvl) { + return lvl + } + } + + return InvalidLevel +} + // String returns a lower-case ASCII representation of the log level. func (l Level) String() string { switch l { diff --git a/vendor/go.uber.org/zap/global_prego112.go b/vendor/go.uber.org/zap/zapcore/reflected_encoder.go similarity index 64% rename from vendor/go.uber.org/zap/global_prego112.go rename to vendor/go.uber.org/zap/zapcore/reflected_encoder.go index d3ab9af933ee..8746360eca6f 100644 --- a/vendor/go.uber.org/zap/global_prego112.go +++ b/vendor/go.uber.org/zap/zapcore/reflected_encoder.go @@ -1,4 +1,4 @@ -// Copyright (c) 2019 Uber Technologies, Inc. +// Copyright (c) 2016 Uber Technologies, Inc. // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal @@ -18,9 +18,24 @@ // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. -// See #682 for more information. -// +build !go1.12 +package zapcore -package zap +import ( + "encoding/json" + "io" +) -const _stdLogDefaultDepth = 2 +// ReflectedEncoder serializes log fields that can't be serialized with Zap's +// JSON encoder. These have the ReflectType field type. +// Use EncoderConfig.NewReflectedEncoder to set this. +type ReflectedEncoder interface { + // Encode encodes and writes to the underlying data stream. + Encode(interface{}) error +} + +func defaultReflectedEncoder(w io.Writer) ReflectedEncoder { + enc := json.NewEncoder(w) + // For consistency with our custom JSON encoder. + enc.SetEscapeHTML(false) + return enc +} diff --git a/vendor/go.uber.org/zap/zapcore/sampler.go b/vendor/go.uber.org/zap/zapcore/sampler.go index 31ed96e129fb..dc518055a417 100644 --- a/vendor/go.uber.org/zap/zapcore/sampler.go +++ b/vendor/go.uber.org/zap/zapcore/sampler.go @@ -1,4 +1,4 @@ -// Copyright (c) 2016 Uber Technologies, Inc. +// Copyright (c) 2016-2022 Uber Technologies, Inc. // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal @@ -113,12 +113,12 @@ func nopSamplingHook(Entry, SamplingDecision) {} // This hook may be used to get visibility into the performance of the sampler. // For example, use it to track metrics of dropped versus sampled logs. // -// var dropped atomic.Int64 -// zapcore.SamplerHook(func(ent zapcore.Entry, dec zapcore.SamplingDecision) { -// if dec&zapcore.LogDropped > 0 { -// dropped.Inc() -// } -// }) +// var dropped atomic.Int64 +// zapcore.SamplerHook(func(ent zapcore.Entry, dec zapcore.SamplingDecision) { +// if dec&zapcore.LogDropped > 0 { +// dropped.Inc() +// } +// }) func SamplerHook(hook func(entry Entry, dec SamplingDecision)) SamplerOption { return optionFunc(func(s *sampler) { s.hook = hook @@ -133,10 +133,21 @@ func SamplerHook(hook func(entry Entry, dec SamplingDecision)) SamplerOption { // each tick. If more Entries with the same level and message are seen during // the same interval, every Mth message is logged and the rest are dropped. // +// For example, +// +// core = NewSamplerWithOptions(core, time.Second, 10, 5) +// +// This will log the first 10 log entries with the same level and message +// in a one second interval as-is. Following that, it will allow through +// every 5th log entry with the same level and message in that interval. +// +// If thereafter is zero, the Core will drop all log entries after the first N +// in that interval. +// // Sampler can be configured to report sampling decisions with the SamplerHook // option. // -// Keep in mind that zap's sampling implementation is optimized for speed over +// Keep in mind that Zap's sampling implementation is optimized for speed over // absolute precision; under load, each tick may be slightly over- or // under-sampled. func NewSamplerWithOptions(core Core, tick time.Duration, first, thereafter int, opts ...SamplerOption) Core { @@ -164,6 +175,11 @@ type sampler struct { hook func(Entry, SamplingDecision) } +var ( + _ Core = (*sampler)(nil) + _ leveledEnabler = (*sampler)(nil) +) + // NewSampler creates a Core that samples incoming entries, which // caps the CPU and I/O load of logging while attempting to preserve a // representative subset of your logs. @@ -181,6 +197,10 @@ func NewSampler(core Core, tick time.Duration, first, thereafter int) Core { return NewSamplerWithOptions(core, tick, first, thereafter) } +func (s *sampler) Level() Level { + return LevelOf(s.Core) +} + func (s *sampler) With(fields []Field) Core { return &sampler{ Core: s.Core.With(fields), @@ -200,7 +220,7 @@ func (s *sampler) Check(ent Entry, ce *CheckedEntry) *CheckedEntry { if ent.Level >= _minLevel && ent.Level <= _maxLevel { counter := s.counts.get(ent.Level, ent.Message) n := counter.IncCheckReset(ent.Time, s.tick) - if n > s.first && (n-s.first)%s.thereafter != 0 { + if n > s.first && (s.thereafter == 0 || (n-s.first)%s.thereafter != 0) { s.hook(ent, LogDropped) return ce } diff --git a/vendor/go.uber.org/zap/zapcore/tee.go b/vendor/go.uber.org/zap/zapcore/tee.go index 07a32eef9a45..9bb32f055764 100644 --- a/vendor/go.uber.org/zap/zapcore/tee.go +++ b/vendor/go.uber.org/zap/zapcore/tee.go @@ -1,4 +1,4 @@ -// Copyright (c) 2016 Uber Technologies, Inc. +// Copyright (c) 2016-2022 Uber Technologies, Inc. // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal @@ -24,6 +24,11 @@ import "go.uber.org/multierr" type multiCore []Core +var ( + _ leveledEnabler = multiCore(nil) + _ Core = multiCore(nil) +) + // NewTee creates a Core that duplicates log entries into two or more // underlying Cores. // @@ -48,6 +53,16 @@ func (mc multiCore) With(fields []Field) Core { return clone } +func (mc multiCore) Level() Level { + minLvl := _maxLevel // mc is never empty + for i := range mc { + if lvl := LevelOf(mc[i]); lvl < minLvl { + minLvl = lvl + } + } + return minLvl +} + func (mc multiCore) Enabled(lvl Level) bool { for i := range mc { if mc[i].Enabled(lvl) { diff --git a/vendor/go.uber.org/zap/zaptest/logger.go b/vendor/go.uber.org/zap/zaptest/logger.go index 1e2451c264c3..6a4a35497ab3 100644 --- a/vendor/go.uber.org/zap/zaptest/logger.go +++ b/vendor/go.uber.org/zap/zaptest/logger.go @@ -61,7 +61,7 @@ func WrapOptions(zapOpts ...zap.Option) LoggerOption { // NewLogger builds a new Logger that logs all messages to the given // testing.TB. // -// logger := zaptest.NewLogger(t) +// logger := zaptest.NewLogger(t) // // Use this with a *testing.T or *testing.B to get logs which get printed only // if a test fails or if you ran go test -v. @@ -69,11 +69,11 @@ func WrapOptions(zapOpts ...zap.Option) LoggerOption { // The returned logger defaults to logging debug level messages and above. // This may be changed by passing a zaptest.Level during construction. // -// logger := zaptest.NewLogger(t, zaptest.Level(zap.WarnLevel)) +// logger := zaptest.NewLogger(t, zaptest.Level(zap.WarnLevel)) // // You may also pass zap.Option's to customize test logger. // -// logger := zaptest.NewLogger(t, zaptest.WrapOptions(zap.AddCaller())) +// logger := zaptest.NewLogger(t, zaptest.WrapOptions(zap.AddCaller())) func NewLogger(t TestingT, opts ...LoggerOption) *zap.Logger { cfg := loggerOptions{ Level: zapcore.DebugLevel, diff --git a/vendor/go.uber.org/zap/zaptest/writer.go b/vendor/go.uber.org/zap/zaptest/writer.go index 0701630e16bc..4b772f8c283d 100644 --- a/vendor/go.uber.org/zap/zaptest/writer.go +++ b/vendor/go.uber.org/zap/zaptest/writer.go @@ -26,7 +26,7 @@ type ( // A Syncer is a spy for the Sync portion of zapcore.WriteSyncer. Syncer = ztest.Syncer - // A Discarder sends all writes to ioutil.Discard. + // A Discarder sends all writes to io.Discard. Discarder = ztest.Discarder // FailWriter is a WriteSyncer that always returns an error on writes. diff --git a/vendor/golang.org/x/mod/internal/lazyregexp/lazyre.go b/vendor/golang.org/x/mod/internal/lazyregexp/lazyre.go index 2681af35af19..150f887e7a4b 100644 --- a/vendor/golang.org/x/mod/internal/lazyregexp/lazyre.go +++ b/vendor/golang.org/x/mod/internal/lazyregexp/lazyre.go @@ -13,7 +13,7 @@ import ( "sync" ) -// Regexp is a wrapper around regexp.Regexp, where the underlying regexp will be +// Regexp is a wrapper around [regexp.Regexp], where the underlying regexp will be // compiled the first time it is needed. type Regexp struct { str string diff --git a/vendor/golang.org/x/mod/module/module.go b/vendor/golang.org/x/mod/module/module.go index e9dec6e61487..2a364b229b9f 100644 --- a/vendor/golang.org/x/mod/module/module.go +++ b/vendor/golang.org/x/mod/module/module.go @@ -4,7 +4,7 @@ // Package module defines the module.Version type along with support code. // -// The module.Version type is a simple Path, Version pair: +// The [module.Version] type is a simple Path, Version pair: // // type Version struct { // Path string @@ -12,7 +12,7 @@ // } // // There are no restrictions imposed directly by use of this structure, -// but additional checking functions, most notably Check, verify that +// but additional checking functions, most notably [Check], verify that // a particular path, version pair is valid. // // # Escaped Paths @@ -140,7 +140,7 @@ type ModuleError struct { Err error } -// VersionError returns a ModuleError derived from a Version and error, +// VersionError returns a [ModuleError] derived from a [Version] and error, // or err itself if it is already such an error. func VersionError(v Version, err error) error { var mErr *ModuleError @@ -169,7 +169,7 @@ func (e *ModuleError) Unwrap() error { return e.Err } // An InvalidVersionError indicates an error specific to a version, with the // module path unknown or specified externally. // -// A ModuleError may wrap an InvalidVersionError, but an InvalidVersionError +// A [ModuleError] may wrap an InvalidVersionError, but an InvalidVersionError // must not wrap a ModuleError. type InvalidVersionError struct { Version string @@ -193,8 +193,8 @@ func (e *InvalidVersionError) Error() string { func (e *InvalidVersionError) Unwrap() error { return e.Err } // An InvalidPathError indicates a module, import, or file path doesn't -// satisfy all naming constraints. See CheckPath, CheckImportPath, -// and CheckFilePath for specific restrictions. +// satisfy all naming constraints. See [CheckPath], [CheckImportPath], +// and [CheckFilePath] for specific restrictions. type InvalidPathError struct { Kind string // "module", "import", or "file" Path string @@ -294,7 +294,7 @@ func fileNameOK(r rune) bool { } // CheckPath checks that a module path is valid. -// A valid module path is a valid import path, as checked by CheckImportPath, +// A valid module path is a valid import path, as checked by [CheckImportPath], // with three additional constraints. // First, the leading path element (up to the first slash, if any), // by convention a domain name, must contain only lower-case ASCII letters, @@ -380,7 +380,7 @@ const ( // checkPath returns an error describing why the path is not valid. // Because these checks apply to module, import, and file paths, // and because other checks may be applied, the caller is expected to wrap -// this error with InvalidPathError. +// this error with [InvalidPathError]. func checkPath(path string, kind pathKind) error { if !utf8.ValidString(path) { return fmt.Errorf("invalid UTF-8") @@ -532,7 +532,7 @@ var badWindowsNames = []string{ // they require ".vN" instead of "/vN", and for all N, not just N >= 2. // SplitPathVersion returns with ok = false when presented with // a path whose last path element does not satisfy the constraints -// applied by CheckPath, such as "example.com/pkg/v1" or "example.com/pkg/v1.2". +// applied by [CheckPath], such as "example.com/pkg/v1" or "example.com/pkg/v1.2". func SplitPathVersion(path string) (prefix, pathMajor string, ok bool) { if strings.HasPrefix(path, "gopkg.in/") { return splitGopkgIn(path) @@ -582,7 +582,7 @@ func splitGopkgIn(path string) (prefix, pathMajor string, ok bool) { // MatchPathMajor reports whether the semantic version v // matches the path major version pathMajor. // -// MatchPathMajor returns true if and only if CheckPathMajor returns nil. +// MatchPathMajor returns true if and only if [CheckPathMajor] returns nil. func MatchPathMajor(v, pathMajor string) bool { return CheckPathMajor(v, pathMajor) == nil } @@ -622,7 +622,7 @@ func CheckPathMajor(v, pathMajor string) error { // PathMajorPrefix returns the major-version tag prefix implied by pathMajor. // An empty PathMajorPrefix allows either v0 or v1. // -// Note that MatchPathMajor may accept some versions that do not actually begin +// Note that [MatchPathMajor] may accept some versions that do not actually begin // with this prefix: namely, it accepts a 'v0.0.0-' prefix for a '.v1' // pathMajor, even though that pathMajor implies 'v1' tagging. func PathMajorPrefix(pathMajor string) string { @@ -643,7 +643,7 @@ func PathMajorPrefix(pathMajor string) string { } // CanonicalVersion returns the canonical form of the version string v. -// It is the same as semver.Canonical(v) except that it preserves the special build suffix "+incompatible". +// It is the same as [semver.Canonical] except that it preserves the special build suffix "+incompatible". func CanonicalVersion(v string) string { cv := semver.Canonical(v) if semver.Build(v) == "+incompatible" { @@ -652,8 +652,8 @@ func CanonicalVersion(v string) string { return cv } -// Sort sorts the list by Path, breaking ties by comparing Version fields. -// The Version fields are interpreted as semantic versions (using semver.Compare) +// Sort sorts the list by Path, breaking ties by comparing [Version] fields. +// The Version fields are interpreted as semantic versions (using [semver.Compare]) // optionally followed by a tie-breaking suffix introduced by a slash character, // like in "v0.0.1/go.mod". func Sort(list []Version) { @@ -793,7 +793,7 @@ func unescapeString(escaped string) (string, bool) { } // MatchPrefixPatterns reports whether any path prefix of target matches one of -// the glob patterns (as defined by path.Match) in the comma-separated globs +// the glob patterns (as defined by [path.Match]) in the comma-separated globs // list. This implements the algorithm used when matching a module path to the // GOPRIVATE environment variable, as described by 'go help module-private'. // diff --git a/vendor/golang.org/x/mod/module/pseudo.go b/vendor/golang.org/x/mod/module/pseudo.go index f04ad3788694..9cf19d3254eb 100644 --- a/vendor/golang.org/x/mod/module/pseudo.go +++ b/vendor/golang.org/x/mod/module/pseudo.go @@ -125,7 +125,7 @@ func IsPseudoVersion(v string) bool { } // IsZeroPseudoVersion returns whether v is a pseudo-version with a zero base, -// timestamp, and revision, as returned by ZeroPseudoVersion. +// timestamp, and revision, as returned by [ZeroPseudoVersion]. func IsZeroPseudoVersion(v string) bool { return v == ZeroPseudoVersion(semver.Major(v)) } diff --git a/vendor/golang.org/x/mod/semver/semver.go b/vendor/golang.org/x/mod/semver/semver.go index a30a22bf20f1..9a2dfd33a770 100644 --- a/vendor/golang.org/x/mod/semver/semver.go +++ b/vendor/golang.org/x/mod/semver/semver.go @@ -140,7 +140,7 @@ func Compare(v, w string) int { // Max canonicalizes its arguments and then returns the version string // that compares greater. // -// Deprecated: use Compare instead. In most cases, returning a canonicalized +// Deprecated: use [Compare] instead. In most cases, returning a canonicalized // version is not expected or desired. func Max(v, w string) string { v = Canonical(v) @@ -151,7 +151,7 @@ func Max(v, w string) string { return w } -// ByVersion implements sort.Interface for sorting semantic version strings. +// ByVersion implements [sort.Interface] for sorting semantic version strings. type ByVersion []string func (vs ByVersion) Len() int { return len(vs) } @@ -164,7 +164,7 @@ func (vs ByVersion) Less(i, j int) bool { return vs[i] < vs[j] } -// Sort sorts a list of semantic version strings using ByVersion. +// Sort sorts a list of semantic version strings using [ByVersion]. func Sort(list []string) { sort.Sort(ByVersion(list)) } diff --git a/vendor/golang.org/x/sync/errgroup/errgroup.go b/vendor/golang.org/x/sync/errgroup/errgroup.go index cbee7a4e230d..b18efb743fe7 100644 --- a/vendor/golang.org/x/sync/errgroup/errgroup.go +++ b/vendor/golang.org/x/sync/errgroup/errgroup.go @@ -20,7 +20,7 @@ type token struct{} // A zero Group is valid, has no limit on the number of active goroutines, // and does not cancel on error. type Group struct { - cancel func() + cancel func(error) wg sync.WaitGroup @@ -43,7 +43,7 @@ func (g *Group) done() { // returns a non-nil error or the first time Wait returns, whichever occurs // first. func WithContext(ctx context.Context) (*Group, context.Context) { - ctx, cancel := context.WithCancel(ctx) + ctx, cancel := withCancelCause(ctx) return &Group{cancel: cancel}, ctx } @@ -52,7 +52,7 @@ func WithContext(ctx context.Context) (*Group, context.Context) { func (g *Group) Wait() error { g.wg.Wait() if g.cancel != nil { - g.cancel() + g.cancel(g.err) } return g.err } @@ -76,7 +76,7 @@ func (g *Group) Go(f func() error) { g.errOnce.Do(func() { g.err = err if g.cancel != nil { - g.cancel() + g.cancel(g.err) } }) } @@ -105,7 +105,7 @@ func (g *Group) TryGo(f func() error) bool { g.errOnce.Do(func() { g.err = err if g.cancel != nil { - g.cancel() + g.cancel(g.err) } }) } diff --git a/vendor/golang.org/x/sync/errgroup/go120.go b/vendor/golang.org/x/sync/errgroup/go120.go new file mode 100644 index 000000000000..7d419d3760ce --- /dev/null +++ b/vendor/golang.org/x/sync/errgroup/go120.go @@ -0,0 +1,14 @@ +// Copyright 2023 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +//go:build go1.20 +// +build go1.20 + +package errgroup + +import "context" + +func withCancelCause(parent context.Context) (context.Context, func(error)) { + return context.WithCancelCause(parent) +} diff --git a/vendor/golang.org/x/sync/errgroup/pre_go120.go b/vendor/golang.org/x/sync/errgroup/pre_go120.go new file mode 100644 index 000000000000..1795c18ace06 --- /dev/null +++ b/vendor/golang.org/x/sync/errgroup/pre_go120.go @@ -0,0 +1,15 @@ +// Copyright 2023 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +//go:build !go1.20 +// +build !go1.20 + +package errgroup + +import "context" + +func withCancelCause(parent context.Context) (context.Context, func(error)) { + ctx, cancel := context.WithCancel(parent) + return ctx, func(error) { cancel() } +} diff --git a/vendor/golang.org/x/sync/singleflight/singleflight.go b/vendor/golang.org/x/sync/singleflight/singleflight.go new file mode 100644 index 000000000000..8473fb7922c1 --- /dev/null +++ b/vendor/golang.org/x/sync/singleflight/singleflight.go @@ -0,0 +1,205 @@ +// Copyright 2013 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Package singleflight provides a duplicate function call suppression +// mechanism. +package singleflight // import "golang.org/x/sync/singleflight" + +import ( + "bytes" + "errors" + "fmt" + "runtime" + "runtime/debug" + "sync" +) + +// errGoexit indicates the runtime.Goexit was called in +// the user given function. +var errGoexit = errors.New("runtime.Goexit was called") + +// A panicError is an arbitrary value recovered from a panic +// with the stack trace during the execution of given function. +type panicError struct { + value interface{} + stack []byte +} + +// Error implements error interface. +func (p *panicError) Error() string { + return fmt.Sprintf("%v\n\n%s", p.value, p.stack) +} + +func newPanicError(v interface{}) error { + stack := debug.Stack() + + // The first line of the stack trace is of the form "goroutine N [status]:" + // but by the time the panic reaches Do the goroutine may no longer exist + // and its status will have changed. Trim out the misleading line. + if line := bytes.IndexByte(stack[:], '\n'); line >= 0 { + stack = stack[line+1:] + } + return &panicError{value: v, stack: stack} +} + +// call is an in-flight or completed singleflight.Do call +type call struct { + wg sync.WaitGroup + + // These fields are written once before the WaitGroup is done + // and are only read after the WaitGroup is done. + val interface{} + err error + + // These fields are read and written with the singleflight + // mutex held before the WaitGroup is done, and are read but + // not written after the WaitGroup is done. + dups int + chans []chan<- Result +} + +// Group represents a class of work and forms a namespace in +// which units of work can be executed with duplicate suppression. +type Group struct { + mu sync.Mutex // protects m + m map[string]*call // lazily initialized +} + +// Result holds the results of Do, so they can be passed +// on a channel. +type Result struct { + Val interface{} + Err error + Shared bool +} + +// Do executes and returns the results of the given function, making +// sure that only one execution is in-flight for a given key at a +// time. If a duplicate comes in, the duplicate caller waits for the +// original to complete and receives the same results. +// The return value shared indicates whether v was given to multiple callers. +func (g *Group) Do(key string, fn func() (interface{}, error)) (v interface{}, err error, shared bool) { + g.mu.Lock() + if g.m == nil { + g.m = make(map[string]*call) + } + if c, ok := g.m[key]; ok { + c.dups++ + g.mu.Unlock() + c.wg.Wait() + + if e, ok := c.err.(*panicError); ok { + panic(e) + } else if c.err == errGoexit { + runtime.Goexit() + } + return c.val, c.err, true + } + c := new(call) + c.wg.Add(1) + g.m[key] = c + g.mu.Unlock() + + g.doCall(c, key, fn) + return c.val, c.err, c.dups > 0 +} + +// DoChan is like Do but returns a channel that will receive the +// results when they are ready. +// +// The returned channel will not be closed. +func (g *Group) DoChan(key string, fn func() (interface{}, error)) <-chan Result { + ch := make(chan Result, 1) + g.mu.Lock() + if g.m == nil { + g.m = make(map[string]*call) + } + if c, ok := g.m[key]; ok { + c.dups++ + c.chans = append(c.chans, ch) + g.mu.Unlock() + return ch + } + c := &call{chans: []chan<- Result{ch}} + c.wg.Add(1) + g.m[key] = c + g.mu.Unlock() + + go g.doCall(c, key, fn) + + return ch +} + +// doCall handles the single call for a key. +func (g *Group) doCall(c *call, key string, fn func() (interface{}, error)) { + normalReturn := false + recovered := false + + // use double-defer to distinguish panic from runtime.Goexit, + // more details see https://golang.org/cl/134395 + defer func() { + // the given function invoked runtime.Goexit + if !normalReturn && !recovered { + c.err = errGoexit + } + + g.mu.Lock() + defer g.mu.Unlock() + c.wg.Done() + if g.m[key] == c { + delete(g.m, key) + } + + if e, ok := c.err.(*panicError); ok { + // In order to prevent the waiting channels from being blocked forever, + // needs to ensure that this panic cannot be recovered. + if len(c.chans) > 0 { + go panic(e) + select {} // Keep this goroutine around so that it will appear in the crash dump. + } else { + panic(e) + } + } else if c.err == errGoexit { + // Already in the process of goexit, no need to call again + } else { + // Normal return + for _, ch := range c.chans { + ch <- Result{c.val, c.err, c.dups > 0} + } + } + }() + + func() { + defer func() { + if !normalReturn { + // Ideally, we would wait to take a stack trace until we've determined + // whether this is a panic or a runtime.Goexit. + // + // Unfortunately, the only way we can distinguish the two is to see + // whether the recover stopped the goroutine from terminating, and by + // the time we know that, the part of the stack trace relevant to the + // panic has been discarded. + if r := recover(); r != nil { + c.err = newPanicError(r) + } + } + }() + + c.val, c.err = fn() + normalReturn = true + }() + + if !normalReturn { + recovered = true + } +} + +// Forget tells the singleflight to forget about a key. Future calls +// to Do for this key will call the function rather than waiting for +// an earlier call to complete. +func (g *Group) Forget(key string) { + g.mu.Lock() + delete(g.m, key) + g.mu.Unlock() +} diff --git a/vendor/golang.org/x/tools/go/gcexportdata/gcexportdata.go b/vendor/golang.org/x/tools/go/gcexportdata/gcexportdata.go index 165ede0f8f38..03543bd4bb8f 100644 --- a/vendor/golang.org/x/tools/go/gcexportdata/gcexportdata.go +++ b/vendor/golang.org/x/tools/go/gcexportdata/gcexportdata.go @@ -128,15 +128,14 @@ func Read(in io.Reader, fset *token.FileSet, imports map[string]*types.Package, // (from "version"). Select appropriate importer. if len(data) > 0 { switch data[0] { - case 'i': - _, pkg, err := gcimporter.IImportData(fset, imports, data[1:], path) - return pkg, err + case 'v', 'c', 'd': // binary, till go1.10 + return nil, fmt.Errorf("binary (%c) import format is no longer supported", data[0]) - case 'v', 'c', 'd': - _, pkg, err := gcimporter.BImportData(fset, imports, data, path) + case 'i': // indexed, till go1.19 + _, pkg, err := gcimporter.IImportData(fset, imports, data[1:], path) return pkg, err - case 'u': + case 'u': // unified, from go1.20 _, pkg, err := gcimporter.UImportData(fset, imports, data[1:], path) return pkg, err diff --git a/vendor/golang.org/x/tools/go/packages/golist.go b/vendor/golang.org/x/tools/go/packages/golist.go index 6bb7168d2e34..58230038a7ce 100644 --- a/vendor/golang.org/x/tools/go/packages/golist.go +++ b/vendor/golang.org/x/tools/go/packages/golist.go @@ -625,7 +625,12 @@ func (state *golistState) createDriverResponse(words ...string) (*driverResponse } if pkg.PkgPath == "unsafe" { - pkg.GoFiles = nil // ignore fake unsafe.go file + pkg.CompiledGoFiles = nil // ignore fake unsafe.go file (#59929) + } else if len(pkg.CompiledGoFiles) == 0 { + // Work around for pre-go.1.11 versions of go list. + // TODO(matloob): they should be handled by the fallback. + // Can we delete this? + pkg.CompiledGoFiles = pkg.GoFiles } // Assume go list emits only absolute paths for Dir. @@ -663,16 +668,12 @@ func (state *golistState) createDriverResponse(words ...string) (*driverResponse response.Roots = append(response.Roots, pkg.ID) } - // Work around for pre-go.1.11 versions of go list. - // TODO(matloob): they should be handled by the fallback. - // Can we delete this? - if len(pkg.CompiledGoFiles) == 0 { - pkg.CompiledGoFiles = pkg.GoFiles - } - // Temporary work-around for golang/go#39986. Parse filenames out of // error messages. This happens if there are unrecoverable syntax // errors in the source, so we can't match on a specific error message. + // + // TODO(rfindley): remove this heuristic, in favor of considering + // InvalidGoFiles from the list driver. if err := p.Error; err != nil && state.shouldAddFilenameFromError(p) { addFilenameFromPos := func(pos string) bool { split := strings.Split(pos, ":") @@ -891,6 +892,15 @@ func golistargs(cfg *Config, words []string, goVersion int) []string { // probably because you'd just get the TestMain. fmt.Sprintf("-find=%t", !cfg.Tests && cfg.Mode&findFlags == 0 && !usesExportData(cfg)), } + + // golang/go#60456: with go1.21 and later, go list serves pgo variants, which + // can be costly to compute and may result in redundant processing for the + // caller. Disable these variants. If someone wants to add e.g. a NeedPGO + // mode flag, that should be a separate proposal. + if goVersion >= 21 { + fullargs = append(fullargs, "-pgo=off") + } + fullargs = append(fullargs, cfg.BuildFlags...) fullargs = append(fullargs, "--") fullargs = append(fullargs, words...) diff --git a/vendor/golang.org/x/tools/go/packages/packages.go b/vendor/golang.org/x/tools/go/packages/packages.go index 0f1505b808a6..632be722a2ba 100644 --- a/vendor/golang.org/x/tools/go/packages/packages.go +++ b/vendor/golang.org/x/tools/go/packages/packages.go @@ -308,6 +308,9 @@ type Package struct { TypeErrors []types.Error // GoFiles lists the absolute file paths of the package's Go source files. + // It may include files that should not be compiled, for example because + // they contain non-matching build tags, are documentary pseudo-files such as + // unsafe/unsafe.go or builtin/builtin.go, or are subject to cgo preprocessing. GoFiles []string // CompiledGoFiles lists the absolute file paths of the package's source diff --git a/vendor/golang.org/x/tools/go/types/objectpath/objectpath.go b/vendor/golang.org/x/tools/go/types/objectpath/objectpath.go deleted file mode 100644 index be8f5a867e65..000000000000 --- a/vendor/golang.org/x/tools/go/types/objectpath/objectpath.go +++ /dev/null @@ -1,762 +0,0 @@ -// Copyright 2018 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// Package objectpath defines a naming scheme for types.Objects -// (that is, named entities in Go programs) relative to their enclosing -// package. -// -// Type-checker objects are canonical, so they are usually identified by -// their address in memory (a pointer), but a pointer has meaning only -// within one address space. By contrast, objectpath names allow the -// identity of an object to be sent from one program to another, -// establishing a correspondence between types.Object variables that are -// distinct but logically equivalent. -// -// A single object may have multiple paths. In this example, -// -// type A struct{ X int } -// type B A -// -// the field X has two paths due to its membership of both A and B. -// The For(obj) function always returns one of these paths, arbitrarily -// but consistently. -package objectpath - -import ( - "fmt" - "go/types" - "sort" - "strconv" - "strings" - - "golang.org/x/tools/internal/typeparams" - - _ "unsafe" // for go:linkname -) - -// A Path is an opaque name that identifies a types.Object -// relative to its package. Conceptually, the name consists of a -// sequence of destructuring operations applied to the package scope -// to obtain the original object. -// The name does not include the package itself. -type Path string - -// Encoding -// -// An object path is a textual and (with training) human-readable encoding -// of a sequence of destructuring operators, starting from a types.Package. -// The sequences represent a path through the package/object/type graph. -// We classify these operators by their type: -// -// PO package->object Package.Scope.Lookup -// OT object->type Object.Type -// TT type->type Type.{Elem,Key,Params,Results,Underlying} [EKPRU] -// TO type->object Type.{At,Field,Method,Obj} [AFMO] -// -// All valid paths start with a package and end at an object -// and thus may be defined by the regular language: -// -// objectpath = PO (OT TT* TO)* -// -// The concrete encoding follows directly: -// - The only PO operator is Package.Scope.Lookup, which requires an identifier. -// - The only OT operator is Object.Type, -// which we encode as '.' because dot cannot appear in an identifier. -// - The TT operators are encoded as [EKPRUTC]; -// one of these (TypeParam) requires an integer operand, -// which is encoded as a string of decimal digits. -// - The TO operators are encoded as [AFMO]; -// three of these (At,Field,Method) require an integer operand, -// which is encoded as a string of decimal digits. -// These indices are stable across different representations -// of the same package, even source and export data. -// The indices used are implementation specific and may not correspond to -// the argument to the go/types function. -// -// In the example below, -// -// package p -// -// type T interface { -// f() (a string, b struct{ X int }) -// } -// -// field X has the path "T.UM0.RA1.F0", -// representing the following sequence of operations: -// -// p.Lookup("T") T -// .Type().Underlying().Method(0). f -// .Type().Results().At(1) b -// .Type().Field(0) X -// -// The encoding is not maximally compact---every R or P is -// followed by an A, for example---but this simplifies the -// encoder and decoder. -const ( - // object->type operators - opType = '.' // .Type() (Object) - - // type->type operators - opElem = 'E' // .Elem() (Pointer, Slice, Array, Chan, Map) - opKey = 'K' // .Key() (Map) - opParams = 'P' // .Params() (Signature) - opResults = 'R' // .Results() (Signature) - opUnderlying = 'U' // .Underlying() (Named) - opTypeParam = 'T' // .TypeParams.At(i) (Named, Signature) - opConstraint = 'C' // .Constraint() (TypeParam) - - // type->object operators - opAt = 'A' // .At(i) (Tuple) - opField = 'F' // .Field(i) (Struct) - opMethod = 'M' // .Method(i) (Named or Interface; not Struct: "promoted" names are ignored) - opObj = 'O' // .Obj() (Named, TypeParam) -) - -// For returns the path to an object relative to its package, -// or an error if the object is not accessible from the package's Scope. -// -// The For function guarantees to return a path only for the following objects: -// - package-level types -// - exported package-level non-types -// - methods -// - parameter and result variables -// - struct fields -// These objects are sufficient to define the API of their package. -// The objects described by a package's export data are drawn from this set. -// -// For does not return a path for predeclared names, imported package -// names, local names, and unexported package-level names (except -// types). -// -// Example: given this definition, -// -// package p -// -// type T interface { -// f() (a string, b struct{ X int }) -// } -// -// For(X) would return a path that denotes the following sequence of operations: -// -// p.Scope().Lookup("T") (TypeName T) -// .Type().Underlying().Method(0). (method Func f) -// .Type().Results().At(1) (field Var b) -// .Type().Field(0) (field Var X) -// -// where p is the package (*types.Package) to which X belongs. -func For(obj types.Object) (Path, error) { - return newEncoderFor()(obj) -} - -// An encoder amortizes the cost of encoding the paths of multiple objects. -// Nonexported pending approval of proposal 58668. -type encoder struct { - scopeNamesMemo map[*types.Scope][]string // memoization of Scope.Names() - namedMethodsMemo map[*types.Named][]*types.Func // memoization of namedMethods() -} - -// Exposed to gopls via golang.org/x/tools/internal/typesinternal -// pending approval of proposal 58668. -// -//go:linkname newEncoderFor -func newEncoderFor() func(types.Object) (Path, error) { return new(encoder).For } - -func (enc *encoder) For(obj types.Object) (Path, error) { - pkg := obj.Pkg() - - // This table lists the cases of interest. - // - // Object Action - // ------ ------ - // nil reject - // builtin reject - // pkgname reject - // label reject - // var - // package-level accept - // func param/result accept - // local reject - // struct field accept - // const - // package-level accept - // local reject - // func - // package-level accept - // init functions reject - // concrete method accept - // interface method accept - // type - // package-level accept - // local reject - // - // The only accessible package-level objects are members of pkg itself. - // - // The cases are handled in four steps: - // - // 1. reject nil and builtin - // 2. accept package-level objects - // 3. reject obviously invalid objects - // 4. search the API for the path to the param/result/field/method. - - // 1. reference to nil or builtin? - if pkg == nil { - return "", fmt.Errorf("predeclared %s has no path", obj) - } - scope := pkg.Scope() - - // 2. package-level object? - if scope.Lookup(obj.Name()) == obj { - // Only exported objects (and non-exported types) have a path. - // Non-exported types may be referenced by other objects. - if _, ok := obj.(*types.TypeName); !ok && !obj.Exported() { - return "", fmt.Errorf("no path for non-exported %v", obj) - } - return Path(obj.Name()), nil - } - - // 3. Not a package-level object. - // Reject obviously non-viable cases. - switch obj := obj.(type) { - case *types.TypeName: - if _, ok := obj.Type().(*typeparams.TypeParam); !ok { - // With the exception of type parameters, only package-level type names - // have a path. - return "", fmt.Errorf("no path for %v", obj) - } - case *types.Const, // Only package-level constants have a path. - *types.Label, // Labels are function-local. - *types.PkgName: // PkgNames are file-local. - return "", fmt.Errorf("no path for %v", obj) - - case *types.Var: - // Could be: - // - a field (obj.IsField()) - // - a func parameter or result - // - a local var. - // Sadly there is no way to distinguish - // a param/result from a local - // so we must proceed to the find. - - case *types.Func: - // A func, if not package-level, must be a method. - if recv := obj.Type().(*types.Signature).Recv(); recv == nil { - return "", fmt.Errorf("func is not a method: %v", obj) - } - - if path, ok := enc.concreteMethod(obj); ok { - // Fast path for concrete methods that avoids looping over scope. - return path, nil - } - - default: - panic(obj) - } - - // 4. Search the API for the path to the var (field/param/result) or method. - - // First inspect package-level named types. - // In the presence of path aliases, these give - // the best paths because non-types may - // refer to types, but not the reverse. - empty := make([]byte, 0, 48) // initial space - names := enc.scopeNames(scope) - for _, name := range names { - o := scope.Lookup(name) - tname, ok := o.(*types.TypeName) - if !ok { - continue // handle non-types in second pass - } - - path := append(empty, name...) - path = append(path, opType) - - T := o.Type() - - if tname.IsAlias() { - // type alias - if r := find(obj, T, path, nil); r != nil { - return Path(r), nil - } - } else { - if named, _ := T.(*types.Named); named != nil { - if r := findTypeParam(obj, typeparams.ForNamed(named), path, nil); r != nil { - // generic named type - return Path(r), nil - } - } - // defined (named) type - if r := find(obj, T.Underlying(), append(path, opUnderlying), nil); r != nil { - return Path(r), nil - } - } - } - - // Then inspect everything else: - // non-types, and declared methods of defined types. - for _, name := range names { - o := scope.Lookup(name) - path := append(empty, name...) - if _, ok := o.(*types.TypeName); !ok { - if o.Exported() { - // exported non-type (const, var, func) - if r := find(obj, o.Type(), append(path, opType), nil); r != nil { - return Path(r), nil - } - } - continue - } - - // Inspect declared methods of defined types. - if T, ok := o.Type().(*types.Named); ok { - path = append(path, opType) - // Note that method index here is always with respect - // to canonical ordering of methods, regardless of how - // they appear in the underlying type. - for i, m := range enc.namedMethods(T) { - path2 := appendOpArg(path, opMethod, i) - if m == obj { - return Path(path2), nil // found declared method - } - if r := find(obj, m.Type(), append(path2, opType), nil); r != nil { - return Path(r), nil - } - } - } - } - - return "", fmt.Errorf("can't find path for %v in %s", obj, pkg.Path()) -} - -func appendOpArg(path []byte, op byte, arg int) []byte { - path = append(path, op) - path = strconv.AppendInt(path, int64(arg), 10) - return path -} - -// concreteMethod returns the path for meth, which must have a non-nil receiver. -// The second return value indicates success and may be false if the method is -// an interface method or if it is an instantiated method. -// -// This function is just an optimization that avoids the general scope walking -// approach. You are expected to fall back to the general approach if this -// function fails. -func (enc *encoder) concreteMethod(meth *types.Func) (Path, bool) { - // Concrete methods can only be declared on package-scoped named types. For - // that reason we can skip the expensive walk over the package scope: the - // path will always be package -> named type -> method. We can trivially get - // the type name from the receiver, and only have to look over the type's - // methods to find the method index. - // - // Methods on generic types require special consideration, however. Consider - // the following package: - // - // L1: type S[T any] struct{} - // L2: func (recv S[A]) Foo() { recv.Bar() } - // L3: func (recv S[B]) Bar() { } - // L4: type Alias = S[int] - // L5: func _[T any]() { var s S[int]; s.Foo() } - // - // The receivers of methods on generic types are instantiations. L2 and L3 - // instantiate S with the type-parameters A and B, which are scoped to the - // respective methods. L4 and L5 each instantiate S with int. Each of these - // instantiations has its own method set, full of methods (and thus objects) - // with receivers whose types are the respective instantiations. In other - // words, we have - // - // S[A].Foo, S[A].Bar - // S[B].Foo, S[B].Bar - // S[int].Foo, S[int].Bar - // - // We may thus be trying to produce object paths for any of these objects. - // - // S[A].Foo and S[B].Bar are the origin methods, and their paths are S.Foo - // and S.Bar, which are the paths that this function naturally produces. - // - // S[A].Bar, S[B].Foo, and both methods on S[int] are instantiations that - // don't correspond to the origin methods. For S[int], this is significant. - // The most precise object path for S[int].Foo, for example, is Alias.Foo, - // not S.Foo. Our function, however, would produce S.Foo, which would - // resolve to a different object. - // - // For S[A].Bar and S[B].Foo it could be argued that S.Bar and S.Foo are - // still the correct paths, since only the origin methods have meaningful - // paths. But this is likely only true for trivial cases and has edge cases. - // Since this function is only an optimization, we err on the side of giving - // up, deferring to the slower but definitely correct algorithm. Most users - // of objectpath will only be giving us origin methods, anyway, as referring - // to instantiated methods is usually not useful. - - if typeparams.OriginMethod(meth) != meth { - return "", false - } - - recvT := meth.Type().(*types.Signature).Recv().Type() - if ptr, ok := recvT.(*types.Pointer); ok { - recvT = ptr.Elem() - } - - named, ok := recvT.(*types.Named) - if !ok { - return "", false - } - - if types.IsInterface(named) { - // Named interfaces don't have to be package-scoped - // - // TODO(dominikh): opt: if scope.Lookup(name) == named, then we can apply this optimization to interface - // methods, too, I think. - return "", false - } - - // Preallocate space for the name, opType, opMethod, and some digits. - name := named.Obj().Name() - path := make([]byte, 0, len(name)+8) - path = append(path, name...) - path = append(path, opType) - for i, m := range enc.namedMethods(named) { - if m == meth { - path = appendOpArg(path, opMethod, i) - return Path(path), true - } - } - - panic(fmt.Sprintf("couldn't find method %s on type %s", meth, named)) -} - -// find finds obj within type T, returning the path to it, or nil if not found. -// -// The seen map is used to short circuit cycles through type parameters. If -// nil, it will be allocated as necessary. -func find(obj types.Object, T types.Type, path []byte, seen map[*types.TypeName]bool) []byte { - switch T := T.(type) { - case *types.Basic, *types.Named: - // Named types belonging to pkg were handled already, - // so T must belong to another package. No path. - return nil - case *types.Pointer: - return find(obj, T.Elem(), append(path, opElem), seen) - case *types.Slice: - return find(obj, T.Elem(), append(path, opElem), seen) - case *types.Array: - return find(obj, T.Elem(), append(path, opElem), seen) - case *types.Chan: - return find(obj, T.Elem(), append(path, opElem), seen) - case *types.Map: - if r := find(obj, T.Key(), append(path, opKey), seen); r != nil { - return r - } - return find(obj, T.Elem(), append(path, opElem), seen) - case *types.Signature: - if r := findTypeParam(obj, typeparams.ForSignature(T), path, seen); r != nil { - return r - } - if r := find(obj, T.Params(), append(path, opParams), seen); r != nil { - return r - } - return find(obj, T.Results(), append(path, opResults), seen) - case *types.Struct: - for i := 0; i < T.NumFields(); i++ { - fld := T.Field(i) - path2 := appendOpArg(path, opField, i) - if fld == obj { - return path2 // found field var - } - if r := find(obj, fld.Type(), append(path2, opType), seen); r != nil { - return r - } - } - return nil - case *types.Tuple: - for i := 0; i < T.Len(); i++ { - v := T.At(i) - path2 := appendOpArg(path, opAt, i) - if v == obj { - return path2 // found param/result var - } - if r := find(obj, v.Type(), append(path2, opType), seen); r != nil { - return r - } - } - return nil - case *types.Interface: - for i := 0; i < T.NumMethods(); i++ { - m := T.Method(i) - path2 := appendOpArg(path, opMethod, i) - if m == obj { - return path2 // found interface method - } - if r := find(obj, m.Type(), append(path2, opType), seen); r != nil { - return r - } - } - return nil - case *typeparams.TypeParam: - name := T.Obj() - if name == obj { - return append(path, opObj) - } - if seen[name] { - return nil - } - if seen == nil { - seen = make(map[*types.TypeName]bool) - } - seen[name] = true - if r := find(obj, T.Constraint(), append(path, opConstraint), seen); r != nil { - return r - } - return nil - } - panic(T) -} - -func findTypeParam(obj types.Object, list *typeparams.TypeParamList, path []byte, seen map[*types.TypeName]bool) []byte { - for i := 0; i < list.Len(); i++ { - tparam := list.At(i) - path2 := appendOpArg(path, opTypeParam, i) - if r := find(obj, tparam, path2, seen); r != nil { - return r - } - } - return nil -} - -// Object returns the object denoted by path p within the package pkg. -func Object(pkg *types.Package, p Path) (types.Object, error) { - if p == "" { - return nil, fmt.Errorf("empty path") - } - - pathstr := string(p) - var pkgobj, suffix string - if dot := strings.IndexByte(pathstr, opType); dot < 0 { - pkgobj = pathstr - } else { - pkgobj = pathstr[:dot] - suffix = pathstr[dot:] // suffix starts with "." - } - - obj := pkg.Scope().Lookup(pkgobj) - if obj == nil { - return nil, fmt.Errorf("package %s does not contain %q", pkg.Path(), pkgobj) - } - - // abstraction of *types.{Pointer,Slice,Array,Chan,Map} - type hasElem interface { - Elem() types.Type - } - // abstraction of *types.{Named,Signature} - type hasTypeParams interface { - TypeParams() *typeparams.TypeParamList - } - // abstraction of *types.{Named,TypeParam} - type hasObj interface { - Obj() *types.TypeName - } - - // The loop state is the pair (t, obj), - // exactly one of which is non-nil, initially obj. - // All suffixes start with '.' (the only object->type operation), - // followed by optional type->type operations, - // then a type->object operation. - // The cycle then repeats. - var t types.Type - for suffix != "" { - code := suffix[0] - suffix = suffix[1:] - - // Codes [AFM] have an integer operand. - var index int - switch code { - case opAt, opField, opMethod, opTypeParam: - rest := strings.TrimLeft(suffix, "0123456789") - numerals := suffix[:len(suffix)-len(rest)] - suffix = rest - i, err := strconv.Atoi(numerals) - if err != nil { - return nil, fmt.Errorf("invalid path: bad numeric operand %q for code %q", numerals, code) - } - index = int(i) - case opObj: - // no operand - default: - // The suffix must end with a type->object operation. - if suffix == "" { - return nil, fmt.Errorf("invalid path: ends with %q, want [AFMO]", code) - } - } - - if code == opType { - if t != nil { - return nil, fmt.Errorf("invalid path: unexpected %q in type context", opType) - } - t = obj.Type() - obj = nil - continue - } - - if t == nil { - return nil, fmt.Errorf("invalid path: code %q in object context", code) - } - - // Inv: t != nil, obj == nil - - switch code { - case opElem: - hasElem, ok := t.(hasElem) // Pointer, Slice, Array, Chan, Map - if !ok { - return nil, fmt.Errorf("cannot apply %q to %s (got %T, want pointer, slice, array, chan or map)", code, t, t) - } - t = hasElem.Elem() - - case opKey: - mapType, ok := t.(*types.Map) - if !ok { - return nil, fmt.Errorf("cannot apply %q to %s (got %T, want map)", code, t, t) - } - t = mapType.Key() - - case opParams: - sig, ok := t.(*types.Signature) - if !ok { - return nil, fmt.Errorf("cannot apply %q to %s (got %T, want signature)", code, t, t) - } - t = sig.Params() - - case opResults: - sig, ok := t.(*types.Signature) - if !ok { - return nil, fmt.Errorf("cannot apply %q to %s (got %T, want signature)", code, t, t) - } - t = sig.Results() - - case opUnderlying: - named, ok := t.(*types.Named) - if !ok { - return nil, fmt.Errorf("cannot apply %q to %s (got %T, want named)", code, t, t) - } - t = named.Underlying() - - case opTypeParam: - hasTypeParams, ok := t.(hasTypeParams) // Named, Signature - if !ok { - return nil, fmt.Errorf("cannot apply %q to %s (got %T, want named or signature)", code, t, t) - } - tparams := hasTypeParams.TypeParams() - if n := tparams.Len(); index >= n { - return nil, fmt.Errorf("tuple index %d out of range [0-%d)", index, n) - } - t = tparams.At(index) - - case opConstraint: - tparam, ok := t.(*typeparams.TypeParam) - if !ok { - return nil, fmt.Errorf("cannot apply %q to %s (got %T, want type parameter)", code, t, t) - } - t = tparam.Constraint() - - case opAt: - tuple, ok := t.(*types.Tuple) - if !ok { - return nil, fmt.Errorf("cannot apply %q to %s (got %T, want tuple)", code, t, t) - } - if n := tuple.Len(); index >= n { - return nil, fmt.Errorf("tuple index %d out of range [0-%d)", index, n) - } - obj = tuple.At(index) - t = nil - - case opField: - structType, ok := t.(*types.Struct) - if !ok { - return nil, fmt.Errorf("cannot apply %q to %s (got %T, want struct)", code, t, t) - } - if n := structType.NumFields(); index >= n { - return nil, fmt.Errorf("field index %d out of range [0-%d)", index, n) - } - obj = structType.Field(index) - t = nil - - case opMethod: - switch t := t.(type) { - case *types.Interface: - if index >= t.NumMethods() { - return nil, fmt.Errorf("method index %d out of range [0-%d)", index, t.NumMethods()) - } - obj = t.Method(index) // Id-ordered - - case *types.Named: - methods := namedMethods(t) // (unmemoized) - if index >= len(methods) { - return nil, fmt.Errorf("method index %d out of range [0-%d)", index, len(methods)) - } - obj = methods[index] // Id-ordered - - default: - return nil, fmt.Errorf("cannot apply %q to %s (got %T, want interface or named)", code, t, t) - } - t = nil - - case opObj: - hasObj, ok := t.(hasObj) - if !ok { - return nil, fmt.Errorf("cannot apply %q to %s (got %T, want named or type param)", code, t, t) - } - obj = hasObj.Obj() - t = nil - - default: - return nil, fmt.Errorf("invalid path: unknown code %q", code) - } - } - - if obj.Pkg() != pkg { - return nil, fmt.Errorf("path denotes %s, which belongs to a different package", obj) - } - - return obj, nil // success -} - -// namedMethods returns the methods of a Named type in ascending Id order. -func namedMethods(named *types.Named) []*types.Func { - methods := make([]*types.Func, named.NumMethods()) - for i := range methods { - methods[i] = named.Method(i) - } - sort.Slice(methods, func(i, j int) bool { - return methods[i].Id() < methods[j].Id() - }) - return methods -} - -// scopeNames is a memoization of scope.Names. Callers must not modify the result. -func (enc *encoder) scopeNames(scope *types.Scope) []string { - m := enc.scopeNamesMemo - if m == nil { - m = make(map[*types.Scope][]string) - enc.scopeNamesMemo = m - } - names, ok := m[scope] - if !ok { - names = scope.Names() // allocates and sorts - m[scope] = names - } - return names -} - -// namedMethods is a memoization of the namedMethods function. Callers must not modify the result. -func (enc *encoder) namedMethods(named *types.Named) []*types.Func { - m := enc.namedMethodsMemo - if m == nil { - m = make(map[*types.Named][]*types.Func) - enc.namedMethodsMemo = m - } - methods, ok := m[named] - if !ok { - methods = namedMethods(named) // allocates and sorts - m[named] = methods - } - return methods - -} diff --git a/vendor/golang.org/x/tools/internal/event/tag/tag.go b/vendor/golang.org/x/tools/internal/event/tag/tag.go new file mode 100644 index 000000000000..581b26c2041f --- /dev/null +++ b/vendor/golang.org/x/tools/internal/event/tag/tag.go @@ -0,0 +1,59 @@ +// Copyright 2019 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Package tag provides the labels used for telemetry throughout gopls. +package tag + +import ( + "golang.org/x/tools/internal/event/keys" +) + +var ( + // create the label keys we use + Method = keys.NewString("method", "") + StatusCode = keys.NewString("status.code", "") + StatusMessage = keys.NewString("status.message", "") + RPCID = keys.NewString("id", "") + RPCDirection = keys.NewString("direction", "") + File = keys.NewString("file", "") + Directory = keys.New("directory", "") + URI = keys.New("URI", "") + Package = keys.NewString("package", "") // sorted comma-separated list of Package IDs + PackagePath = keys.NewString("package_path", "") + Query = keys.New("query", "") + Snapshot = keys.NewUInt64("snapshot", "") + Operation = keys.NewString("operation", "") + + Position = keys.New("position", "") + Category = keys.NewString("category", "") + PackageCount = keys.NewInt("packages", "") + Files = keys.New("files", "") + Port = keys.NewInt("port", "") + Type = keys.New("type", "") + HoverKind = keys.NewString("hoverkind", "") + + NewServer = keys.NewString("new_server", "A new server was added") + EndServer = keys.NewString("end_server", "A server was shut down") + + ServerID = keys.NewString("server", "The server ID an event is related to") + Logfile = keys.NewString("logfile", "") + DebugAddress = keys.NewString("debug_address", "") + GoplsPath = keys.NewString("gopls_path", "") + ClientID = keys.NewString("client_id", "") + + Level = keys.NewInt("level", "The logging level") +) + +var ( + // create the stats we measure + Started = keys.NewInt64("started", "Count of started RPCs.") + ReceivedBytes = keys.NewInt64("received_bytes", "Bytes received.") //, unit.Bytes) + SentBytes = keys.NewInt64("sent_bytes", "Bytes sent.") //, unit.Bytes) + Latency = keys.NewFloat64("latency_ms", "Elapsed time in milliseconds") //, unit.Milliseconds) +) + +const ( + Inbound = "in" + Outbound = "out" +) diff --git a/vendor/golang.org/x/tools/internal/fastwalk/fastwalk.go b/vendor/golang.org/x/tools/internal/fastwalk/fastwalk.go index 798fe599be4c..c40c7e931066 100644 --- a/vendor/golang.org/x/tools/internal/fastwalk/fastwalk.go +++ b/vendor/golang.org/x/tools/internal/fastwalk/fastwalk.go @@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. -// Package fastwalk provides a faster version of filepath.Walk for file system +// Package fastwalk provides a faster version of [filepath.Walk] for file system // scanning tools. package fastwalk @@ -23,31 +23,31 @@ var ErrTraverseLink = errors.New("fastwalk: traverse symlink, assuming target is // Child directories will still be traversed. var ErrSkipFiles = errors.New("fastwalk: skip remaining files in directory") -// Walk is a faster implementation of filepath.Walk. +// Walk is a faster implementation of [filepath.Walk]. // -// filepath.Walk's design necessarily calls os.Lstat on each file, +// [filepath.Walk]'s design necessarily calls [os.Lstat] on each file, // even if the caller needs less info. // Many tools need only the type of each file. // On some platforms, this information is provided directly by the readdir // system call, avoiding the need to stat each file individually. // fastwalk_unix.go contains a fork of the syscall routines. // -// See golang.org/issue/16399 +// See golang.org/issue/16399. // // Walk walks the file tree rooted at root, calling walkFn for // each file or directory in the tree, including root. // -// If fastWalk returns filepath.SkipDir, the directory is skipped. +// If Walk returns [filepath.SkipDir], the directory is skipped. // -// Unlike filepath.Walk: +// Unlike [filepath.Walk]: // - file stat calls must be done by the user. // The only provided metadata is the file type, which does not include // any permission bits. // - multiple goroutines stat the filesystem concurrently. The provided // walkFn must be safe for concurrent use. -// - fastWalk can follow symlinks if walkFn returns the TraverseLink +// - Walk can follow symlinks if walkFn returns the TraverseLink // sentinel error. It is the walkFn's responsibility to prevent -// fastWalk from going into symlink cycles. +// Walk from going into symlink cycles. func Walk(root string, walkFn func(path string, typ os.FileMode) error) error { // TODO(bradfitz): make numWorkers configurable? We used a // minimum of 4 to give the kernel more info about multiple diff --git a/vendor/golang.org/x/tools/internal/gcimporter/bexport.go b/vendor/golang.org/x/tools/internal/gcimporter/bexport.go deleted file mode 100644 index 30582ed6d3d7..000000000000 --- a/vendor/golang.org/x/tools/internal/gcimporter/bexport.go +++ /dev/null @@ -1,852 +0,0 @@ -// Copyright 2016 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// Binary package export. -// This file was derived from $GOROOT/src/cmd/compile/internal/gc/bexport.go; -// see that file for specification of the format. - -package gcimporter - -import ( - "bytes" - "encoding/binary" - "fmt" - "go/constant" - "go/token" - "go/types" - "math" - "math/big" - "sort" - "strings" -) - -// If debugFormat is set, each integer and string value is preceded by a marker -// and position information in the encoding. This mechanism permits an importer -// to recognize immediately when it is out of sync. The importer recognizes this -// mode automatically (i.e., it can import export data produced with debugging -// support even if debugFormat is not set at the time of import). This mode will -// lead to massively larger export data (by a factor of 2 to 3) and should only -// be enabled during development and debugging. -// -// NOTE: This flag is the first flag to enable if importing dies because of -// (suspected) format errors, and whenever a change is made to the format. -const debugFormat = false // default: false - -// Current export format version. Increase with each format change. -// -// Note: The latest binary (non-indexed) export format is at version 6. -// This exporter is still at level 4, but it doesn't matter since -// the binary importer can handle older versions just fine. -// -// 6: package height (CL 105038) -- NOT IMPLEMENTED HERE -// 5: improved position encoding efficiency (issue 20080, CL 41619) -- NOT IMPLEMENTED HERE -// 4: type name objects support type aliases, uses aliasTag -// 3: Go1.8 encoding (same as version 2, aliasTag defined but never used) -// 2: removed unused bool in ODCL export (compiler only) -// 1: header format change (more regular), export package for _ struct fields -// 0: Go1.7 encoding -const exportVersion = 4 - -// trackAllTypes enables cycle tracking for all types, not just named -// types. The existing compiler invariants assume that unnamed types -// that are not completely set up are not used, or else there are spurious -// errors. -// If disabled, only named types are tracked, possibly leading to slightly -// less efficient encoding in rare cases. It also prevents the export of -// some corner-case type declarations (but those are not handled correctly -// with with the textual export format either). -// TODO(gri) enable and remove once issues caused by it are fixed -const trackAllTypes = false - -type exporter struct { - fset *token.FileSet - out bytes.Buffer - - // object -> index maps, indexed in order of serialization - strIndex map[string]int - pkgIndex map[*types.Package]int - typIndex map[types.Type]int - - // position encoding - posInfoFormat bool - prevFile string - prevLine int - - // debugging support - written int // bytes written - indent int // for trace -} - -// internalError represents an error generated inside this package. -type internalError string - -func (e internalError) Error() string { return "gcimporter: " + string(e) } - -func internalErrorf(format string, args ...interface{}) error { - return internalError(fmt.Sprintf(format, args...)) -} - -// BExportData returns binary export data for pkg. -// If no file set is provided, position info will be missing. -func BExportData(fset *token.FileSet, pkg *types.Package) (b []byte, err error) { - if !debug { - defer func() { - if e := recover(); e != nil { - if ierr, ok := e.(internalError); ok { - err = ierr - return - } - // Not an internal error; panic again. - panic(e) - } - }() - } - - p := exporter{ - fset: fset, - strIndex: map[string]int{"": 0}, // empty string is mapped to 0 - pkgIndex: make(map[*types.Package]int), - typIndex: make(map[types.Type]int), - posInfoFormat: true, // TODO(gri) might become a flag, eventually - } - - // write version info - // The version string must start with "version %d" where %d is the version - // number. Additional debugging information may follow after a blank; that - // text is ignored by the importer. - p.rawStringln(fmt.Sprintf("version %d", exportVersion)) - var debug string - if debugFormat { - debug = "debug" - } - p.rawStringln(debug) // cannot use p.bool since it's affected by debugFormat; also want to see this clearly - p.bool(trackAllTypes) - p.bool(p.posInfoFormat) - - // --- generic export data --- - - // populate type map with predeclared "known" types - for index, typ := range predeclared() { - p.typIndex[typ] = index - } - if len(p.typIndex) != len(predeclared()) { - return nil, internalError("duplicate entries in type map?") - } - - // write package data - p.pkg(pkg, true) - if trace { - p.tracef("\n") - } - - // write objects - objcount := 0 - scope := pkg.Scope() - for _, name := range scope.Names() { - if !token.IsExported(name) { - continue - } - if trace { - p.tracef("\n") - } - p.obj(scope.Lookup(name)) - objcount++ - } - - // indicate end of list - if trace { - p.tracef("\n") - } - p.tag(endTag) - - // for self-verification only (redundant) - p.int(objcount) - - if trace { - p.tracef("\n") - } - - // --- end of export data --- - - return p.out.Bytes(), nil -} - -func (p *exporter) pkg(pkg *types.Package, emptypath bool) { - if pkg == nil { - panic(internalError("unexpected nil pkg")) - } - - // if we saw the package before, write its index (>= 0) - if i, ok := p.pkgIndex[pkg]; ok { - p.index('P', i) - return - } - - // otherwise, remember the package, write the package tag (< 0) and package data - if trace { - p.tracef("P%d = { ", len(p.pkgIndex)) - defer p.tracef("} ") - } - p.pkgIndex[pkg] = len(p.pkgIndex) - - p.tag(packageTag) - p.string(pkg.Name()) - if emptypath { - p.string("") - } else { - p.string(pkg.Path()) - } -} - -func (p *exporter) obj(obj types.Object) { - switch obj := obj.(type) { - case *types.Const: - p.tag(constTag) - p.pos(obj) - p.qualifiedName(obj) - p.typ(obj.Type()) - p.value(obj.Val()) - - case *types.TypeName: - if obj.IsAlias() { - p.tag(aliasTag) - p.pos(obj) - p.qualifiedName(obj) - } else { - p.tag(typeTag) - } - p.typ(obj.Type()) - - case *types.Var: - p.tag(varTag) - p.pos(obj) - p.qualifiedName(obj) - p.typ(obj.Type()) - - case *types.Func: - p.tag(funcTag) - p.pos(obj) - p.qualifiedName(obj) - sig := obj.Type().(*types.Signature) - p.paramList(sig.Params(), sig.Variadic()) - p.paramList(sig.Results(), false) - - default: - panic(internalErrorf("unexpected object %v (%T)", obj, obj)) - } -} - -func (p *exporter) pos(obj types.Object) { - if !p.posInfoFormat { - return - } - - file, line := p.fileLine(obj) - if file == p.prevFile { - // common case: write line delta - // delta == 0 means different file or no line change - delta := line - p.prevLine - p.int(delta) - if delta == 0 { - p.int(-1) // -1 means no file change - } - } else { - // different file - p.int(0) - // Encode filename as length of common prefix with previous - // filename, followed by (possibly empty) suffix. Filenames - // frequently share path prefixes, so this can save a lot - // of space and make export data size less dependent on file - // path length. The suffix is unlikely to be empty because - // file names tend to end in ".go". - n := commonPrefixLen(p.prevFile, file) - p.int(n) // n >= 0 - p.string(file[n:]) // write suffix only - p.prevFile = file - p.int(line) - } - p.prevLine = line -} - -func (p *exporter) fileLine(obj types.Object) (file string, line int) { - if p.fset != nil { - pos := p.fset.Position(obj.Pos()) - file = pos.Filename - line = pos.Line - } - return -} - -func commonPrefixLen(a, b string) int { - if len(a) > len(b) { - a, b = b, a - } - // len(a) <= len(b) - i := 0 - for i < len(a) && a[i] == b[i] { - i++ - } - return i -} - -func (p *exporter) qualifiedName(obj types.Object) { - p.string(obj.Name()) - p.pkg(obj.Pkg(), false) -} - -func (p *exporter) typ(t types.Type) { - if t == nil { - panic(internalError("nil type")) - } - - // Possible optimization: Anonymous pointer types *T where - // T is a named type are common. We could canonicalize all - // such types *T to a single type PT = *T. This would lead - // to at most one *T entry in typIndex, and all future *T's - // would be encoded as the respective index directly. Would - // save 1 byte (pointerTag) per *T and reduce the typIndex - // size (at the cost of a canonicalization map). We can do - // this later, without encoding format change. - - // if we saw the type before, write its index (>= 0) - if i, ok := p.typIndex[t]; ok { - p.index('T', i) - return - } - - // otherwise, remember the type, write the type tag (< 0) and type data - if trackAllTypes { - if trace { - p.tracef("T%d = {>\n", len(p.typIndex)) - defer p.tracef("<\n} ") - } - p.typIndex[t] = len(p.typIndex) - } - - switch t := t.(type) { - case *types.Named: - if !trackAllTypes { - // if we don't track all types, track named types now - p.typIndex[t] = len(p.typIndex) - } - - p.tag(namedTag) - p.pos(t.Obj()) - p.qualifiedName(t.Obj()) - p.typ(t.Underlying()) - if !types.IsInterface(t) { - p.assocMethods(t) - } - - case *types.Array: - p.tag(arrayTag) - p.int64(t.Len()) - p.typ(t.Elem()) - - case *types.Slice: - p.tag(sliceTag) - p.typ(t.Elem()) - - case *dddSlice: - p.tag(dddTag) - p.typ(t.elem) - - case *types.Struct: - p.tag(structTag) - p.fieldList(t) - - case *types.Pointer: - p.tag(pointerTag) - p.typ(t.Elem()) - - case *types.Signature: - p.tag(signatureTag) - p.paramList(t.Params(), t.Variadic()) - p.paramList(t.Results(), false) - - case *types.Interface: - p.tag(interfaceTag) - p.iface(t) - - case *types.Map: - p.tag(mapTag) - p.typ(t.Key()) - p.typ(t.Elem()) - - case *types.Chan: - p.tag(chanTag) - p.int(int(3 - t.Dir())) // hack - p.typ(t.Elem()) - - default: - panic(internalErrorf("unexpected type %T: %s", t, t)) - } -} - -func (p *exporter) assocMethods(named *types.Named) { - // Sort methods (for determinism). - var methods []*types.Func - for i := 0; i < named.NumMethods(); i++ { - methods = append(methods, named.Method(i)) - } - sort.Sort(methodsByName(methods)) - - p.int(len(methods)) - - if trace && methods != nil { - p.tracef("associated methods {>\n") - } - - for i, m := range methods { - if trace && i > 0 { - p.tracef("\n") - } - - p.pos(m) - name := m.Name() - p.string(name) - if !exported(name) { - p.pkg(m.Pkg(), false) - } - - sig := m.Type().(*types.Signature) - p.paramList(types.NewTuple(sig.Recv()), false) - p.paramList(sig.Params(), sig.Variadic()) - p.paramList(sig.Results(), false) - p.int(0) // dummy value for go:nointerface pragma - ignored by importer - } - - if trace && methods != nil { - p.tracef("<\n} ") - } -} - -type methodsByName []*types.Func - -func (x methodsByName) Len() int { return len(x) } -func (x methodsByName) Swap(i, j int) { x[i], x[j] = x[j], x[i] } -func (x methodsByName) Less(i, j int) bool { return x[i].Name() < x[j].Name() } - -func (p *exporter) fieldList(t *types.Struct) { - if trace && t.NumFields() > 0 { - p.tracef("fields {>\n") - defer p.tracef("<\n} ") - } - - p.int(t.NumFields()) - for i := 0; i < t.NumFields(); i++ { - if trace && i > 0 { - p.tracef("\n") - } - p.field(t.Field(i)) - p.string(t.Tag(i)) - } -} - -func (p *exporter) field(f *types.Var) { - if !f.IsField() { - panic(internalError("field expected")) - } - - p.pos(f) - p.fieldName(f) - p.typ(f.Type()) -} - -func (p *exporter) iface(t *types.Interface) { - // TODO(gri): enable importer to load embedded interfaces, - // then emit Embeddeds and ExplicitMethods separately here. - p.int(0) - - n := t.NumMethods() - if trace && n > 0 { - p.tracef("methods {>\n") - defer p.tracef("<\n} ") - } - p.int(n) - for i := 0; i < n; i++ { - if trace && i > 0 { - p.tracef("\n") - } - p.method(t.Method(i)) - } -} - -func (p *exporter) method(m *types.Func) { - sig := m.Type().(*types.Signature) - if sig.Recv() == nil { - panic(internalError("method expected")) - } - - p.pos(m) - p.string(m.Name()) - if m.Name() != "_" && !token.IsExported(m.Name()) { - p.pkg(m.Pkg(), false) - } - - // interface method; no need to encode receiver. - p.paramList(sig.Params(), sig.Variadic()) - p.paramList(sig.Results(), false) -} - -func (p *exporter) fieldName(f *types.Var) { - name := f.Name() - - if f.Anonymous() { - // anonymous field - we distinguish between 3 cases: - // 1) field name matches base type name and is exported - // 2) field name matches base type name and is not exported - // 3) field name doesn't match base type name (alias name) - bname := basetypeName(f.Type()) - if name == bname { - if token.IsExported(name) { - name = "" // 1) we don't need to know the field name or package - } else { - name = "?" // 2) use unexported name "?" to force package export - } - } else { - // 3) indicate alias and export name as is - // (this requires an extra "@" but this is a rare case) - p.string("@") - } - } - - p.string(name) - if name != "" && !token.IsExported(name) { - p.pkg(f.Pkg(), false) - } -} - -func basetypeName(typ types.Type) string { - switch typ := deref(typ).(type) { - case *types.Basic: - return typ.Name() - case *types.Named: - return typ.Obj().Name() - default: - return "" // unnamed type - } -} - -func (p *exporter) paramList(params *types.Tuple, variadic bool) { - // use negative length to indicate unnamed parameters - // (look at the first parameter only since either all - // names are present or all are absent) - n := params.Len() - if n > 0 && params.At(0).Name() == "" { - n = -n - } - p.int(n) - for i := 0; i < params.Len(); i++ { - q := params.At(i) - t := q.Type() - if variadic && i == params.Len()-1 { - t = &dddSlice{t.(*types.Slice).Elem()} - } - p.typ(t) - if n > 0 { - name := q.Name() - p.string(name) - if name != "_" { - p.pkg(q.Pkg(), false) - } - } - p.string("") // no compiler-specific info - } -} - -func (p *exporter) value(x constant.Value) { - if trace { - p.tracef("= ") - } - - switch x.Kind() { - case constant.Bool: - tag := falseTag - if constant.BoolVal(x) { - tag = trueTag - } - p.tag(tag) - - case constant.Int: - if v, exact := constant.Int64Val(x); exact { - // common case: x fits into an int64 - use compact encoding - p.tag(int64Tag) - p.int64(v) - return - } - // uncommon case: large x - use float encoding - // (powers of 2 will be encoded efficiently with exponent) - p.tag(floatTag) - p.float(constant.ToFloat(x)) - - case constant.Float: - p.tag(floatTag) - p.float(x) - - case constant.Complex: - p.tag(complexTag) - p.float(constant.Real(x)) - p.float(constant.Imag(x)) - - case constant.String: - p.tag(stringTag) - p.string(constant.StringVal(x)) - - case constant.Unknown: - // package contains type errors - p.tag(unknownTag) - - default: - panic(internalErrorf("unexpected value %v (%T)", x, x)) - } -} - -func (p *exporter) float(x constant.Value) { - if x.Kind() != constant.Float { - panic(internalErrorf("unexpected constant %v, want float", x)) - } - // extract sign (there is no -0) - sign := constant.Sign(x) - if sign == 0 { - // x == 0 - p.int(0) - return - } - // x != 0 - - var f big.Float - if v, exact := constant.Float64Val(x); exact { - // float64 - f.SetFloat64(v) - } else if num, denom := constant.Num(x), constant.Denom(x); num.Kind() == constant.Int { - // TODO(gri): add big.Rat accessor to constant.Value. - r := valueToRat(num) - f.SetRat(r.Quo(r, valueToRat(denom))) - } else { - // Value too large to represent as a fraction => inaccessible. - // TODO(gri): add big.Float accessor to constant.Value. - f.SetFloat64(math.MaxFloat64) // FIXME - } - - // extract exponent such that 0.5 <= m < 1.0 - var m big.Float - exp := f.MantExp(&m) - - // extract mantissa as *big.Int - // - set exponent large enough so mant satisfies mant.IsInt() - // - get *big.Int from mant - m.SetMantExp(&m, int(m.MinPrec())) - mant, acc := m.Int(nil) - if acc != big.Exact { - panic(internalError("internal error")) - } - - p.int(sign) - p.int(exp) - p.string(string(mant.Bytes())) -} - -func valueToRat(x constant.Value) *big.Rat { - // Convert little-endian to big-endian. - // I can't believe this is necessary. - bytes := constant.Bytes(x) - for i := 0; i < len(bytes)/2; i++ { - bytes[i], bytes[len(bytes)-1-i] = bytes[len(bytes)-1-i], bytes[i] - } - return new(big.Rat).SetInt(new(big.Int).SetBytes(bytes)) -} - -func (p *exporter) bool(b bool) bool { - if trace { - p.tracef("[") - defer p.tracef("= %v] ", b) - } - - x := 0 - if b { - x = 1 - } - p.int(x) - return b -} - -// ---------------------------------------------------------------------------- -// Low-level encoders - -func (p *exporter) index(marker byte, index int) { - if index < 0 { - panic(internalError("invalid index < 0")) - } - if debugFormat { - p.marker('t') - } - if trace { - p.tracef("%c%d ", marker, index) - } - p.rawInt64(int64(index)) -} - -func (p *exporter) tag(tag int) { - if tag >= 0 { - panic(internalError("invalid tag >= 0")) - } - if debugFormat { - p.marker('t') - } - if trace { - p.tracef("%s ", tagString[-tag]) - } - p.rawInt64(int64(tag)) -} - -func (p *exporter) int(x int) { - p.int64(int64(x)) -} - -func (p *exporter) int64(x int64) { - if debugFormat { - p.marker('i') - } - if trace { - p.tracef("%d ", x) - } - p.rawInt64(x) -} - -func (p *exporter) string(s string) { - if debugFormat { - p.marker('s') - } - if trace { - p.tracef("%q ", s) - } - // if we saw the string before, write its index (>= 0) - // (the empty string is mapped to 0) - if i, ok := p.strIndex[s]; ok { - p.rawInt64(int64(i)) - return - } - // otherwise, remember string and write its negative length and bytes - p.strIndex[s] = len(p.strIndex) - p.rawInt64(-int64(len(s))) - for i := 0; i < len(s); i++ { - p.rawByte(s[i]) - } -} - -// marker emits a marker byte and position information which makes -// it easy for a reader to detect if it is "out of sync". Used for -// debugFormat format only. -func (p *exporter) marker(m byte) { - p.rawByte(m) - // Enable this for help tracking down the location - // of an incorrect marker when running in debugFormat. - if false && trace { - p.tracef("#%d ", p.written) - } - p.rawInt64(int64(p.written)) -} - -// rawInt64 should only be used by low-level encoders. -func (p *exporter) rawInt64(x int64) { - var tmp [binary.MaxVarintLen64]byte - n := binary.PutVarint(tmp[:], x) - for i := 0; i < n; i++ { - p.rawByte(tmp[i]) - } -} - -// rawStringln should only be used to emit the initial version string. -func (p *exporter) rawStringln(s string) { - for i := 0; i < len(s); i++ { - p.rawByte(s[i]) - } - p.rawByte('\n') -} - -// rawByte is the bottleneck interface to write to p.out. -// rawByte escapes b as follows (any encoding does that -// hides '$'): -// -// '$' => '|' 'S' -// '|' => '|' '|' -// -// Necessary so other tools can find the end of the -// export data by searching for "$$". -// rawByte should only be used by low-level encoders. -func (p *exporter) rawByte(b byte) { - switch b { - case '$': - // write '$' as '|' 'S' - b = 'S' - fallthrough - case '|': - // write '|' as '|' '|' - p.out.WriteByte('|') - p.written++ - } - p.out.WriteByte(b) - p.written++ -} - -// tracef is like fmt.Printf but it rewrites the format string -// to take care of indentation. -func (p *exporter) tracef(format string, args ...interface{}) { - if strings.ContainsAny(format, "<>\n") { - var buf bytes.Buffer - for i := 0; i < len(format); i++ { - // no need to deal with runes - ch := format[i] - switch ch { - case '>': - p.indent++ - continue - case '<': - p.indent-- - continue - } - buf.WriteByte(ch) - if ch == '\n' { - for j := p.indent; j > 0; j-- { - buf.WriteString(". ") - } - } - } - format = buf.String() - } - fmt.Printf(format, args...) -} - -// Debugging support. -// (tagString is only used when tracing is enabled) -var tagString = [...]string{ - // Packages - -packageTag: "package", - - // Types - -namedTag: "named type", - -arrayTag: "array", - -sliceTag: "slice", - -dddTag: "ddd", - -structTag: "struct", - -pointerTag: "pointer", - -signatureTag: "signature", - -interfaceTag: "interface", - -mapTag: "map", - -chanTag: "chan", - - // Values - -falseTag: "false", - -trueTag: "true", - -int64Tag: "int64", - -floatTag: "float", - -fractionTag: "fraction", - -complexTag: "complex", - -stringTag: "string", - -unknownTag: "unknown", - - // Type aliases - -aliasTag: "alias", -} diff --git a/vendor/golang.org/x/tools/internal/gcimporter/bimport.go b/vendor/golang.org/x/tools/internal/gcimporter/bimport.go index b85de0147001..d98b0db2a9a9 100644 --- a/vendor/golang.org/x/tools/internal/gcimporter/bimport.go +++ b/vendor/golang.org/x/tools/internal/gcimporter/bimport.go @@ -2,340 +2,24 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. -// This file is a copy of $GOROOT/src/go/internal/gcimporter/bimport.go. +// This file contains the remaining vestiges of +// $GOROOT/src/go/internal/gcimporter/bimport.go. package gcimporter import ( - "encoding/binary" "fmt" - "go/constant" "go/token" "go/types" - "sort" - "strconv" - "strings" "sync" - "unicode" - "unicode/utf8" ) -type importer struct { - imports map[string]*types.Package - data []byte - importpath string - buf []byte // for reading strings - version int // export format version - - // object lists - strList []string // in order of appearance - pathList []string // in order of appearance - pkgList []*types.Package // in order of appearance - typList []types.Type // in order of appearance - interfaceList []*types.Interface // for delayed completion only - trackAllTypes bool - - // position encoding - posInfoFormat bool - prevFile string - prevLine int - fake fakeFileSet - - // debugging support - debugFormat bool - read int // bytes read -} - -// BImportData imports a package from the serialized package data -// and returns the number of bytes consumed and a reference to the package. -// If the export data version is not recognized or the format is otherwise -// compromised, an error is returned. -func BImportData(fset *token.FileSet, imports map[string]*types.Package, data []byte, path string) (_ int, pkg *types.Package, err error) { - // catch panics and return them as errors - const currentVersion = 6 - version := -1 // unknown version - defer func() { - if e := recover(); e != nil { - // Return a (possibly nil or incomplete) package unchanged (see #16088). - if version > currentVersion { - err = fmt.Errorf("cannot import %q (%v), export data is newer version - update tool", path, e) - } else { - err = fmt.Errorf("cannot import %q (%v), possibly version skew - reinstall package", path, e) - } - } - }() - - p := importer{ - imports: imports, - data: data, - importpath: path, - version: version, - strList: []string{""}, // empty string is mapped to 0 - pathList: []string{""}, // empty string is mapped to 0 - fake: fakeFileSet{ - fset: fset, - files: make(map[string]*fileInfo), - }, - } - defer p.fake.setLines() // set lines for files in fset - - // read version info - var versionstr string - if b := p.rawByte(); b == 'c' || b == 'd' { - // Go1.7 encoding; first byte encodes low-level - // encoding format (compact vs debug). - // For backward-compatibility only (avoid problems with - // old installed packages). Newly compiled packages use - // the extensible format string. - // TODO(gri) Remove this support eventually; after Go1.8. - if b == 'd' { - p.debugFormat = true - } - p.trackAllTypes = p.rawByte() == 'a' - p.posInfoFormat = p.int() != 0 - versionstr = p.string() - if versionstr == "v1" { - version = 0 - } - } else { - // Go1.8 extensible encoding - // read version string and extract version number (ignore anything after the version number) - versionstr = p.rawStringln(b) - if s := strings.SplitN(versionstr, " ", 3); len(s) >= 2 && s[0] == "version" { - if v, err := strconv.Atoi(s[1]); err == nil && v > 0 { - version = v - } - } - } - p.version = version - - // read version specific flags - extend as necessary - switch p.version { - // case currentVersion: - // ... - // fallthrough - case currentVersion, 5, 4, 3, 2, 1: - p.debugFormat = p.rawStringln(p.rawByte()) == "debug" - p.trackAllTypes = p.int() != 0 - p.posInfoFormat = p.int() != 0 - case 0: - // Go1.7 encoding format - nothing to do here - default: - errorf("unknown bexport format version %d (%q)", p.version, versionstr) - } - - // --- generic export data --- - - // populate typList with predeclared "known" types - p.typList = append(p.typList, predeclared()...) - - // read package data - pkg = p.pkg() - - // read objects of phase 1 only (see cmd/compile/internal/gc/bexport.go) - objcount := 0 - for { - tag := p.tagOrIndex() - if tag == endTag { - break - } - p.obj(tag) - objcount++ - } - - // self-verification - if count := p.int(); count != objcount { - errorf("got %d objects; want %d", objcount, count) - } - - // ignore compiler-specific import data - - // complete interfaces - // TODO(gri) re-investigate if we still need to do this in a delayed fashion - for _, typ := range p.interfaceList { - typ.Complete() - } - - // record all referenced packages as imports - list := append(([]*types.Package)(nil), p.pkgList[1:]...) - sort.Sort(byPath(list)) - pkg.SetImports(list) - - // package was imported completely and without errors - pkg.MarkComplete() - - return p.read, pkg, nil -} - func errorf(format string, args ...interface{}) { panic(fmt.Sprintf(format, args...)) } -func (p *importer) pkg() *types.Package { - // if the package was seen before, i is its index (>= 0) - i := p.tagOrIndex() - if i >= 0 { - return p.pkgList[i] - } - - // otherwise, i is the package tag (< 0) - if i != packageTag { - errorf("unexpected package tag %d version %d", i, p.version) - } - - // read package data - name := p.string() - var path string - if p.version >= 5 { - path = p.path() - } else { - path = p.string() - } - if p.version >= 6 { - p.int() // package height; unused by go/types - } - - // we should never see an empty package name - if name == "" { - errorf("empty package name in import") - } - - // an empty path denotes the package we are currently importing; - // it must be the first package we see - if (path == "") != (len(p.pkgList) == 0) { - errorf("package path %q for pkg index %d", path, len(p.pkgList)) - } - - // if the package was imported before, use that one; otherwise create a new one - if path == "" { - path = p.importpath - } - pkg := p.imports[path] - if pkg == nil { - pkg = types.NewPackage(path, name) - p.imports[path] = pkg - } else if pkg.Name() != name { - errorf("conflicting names %s and %s for package %q", pkg.Name(), name, path) - } - p.pkgList = append(p.pkgList, pkg) - - return pkg -} - -// objTag returns the tag value for each object kind. -func objTag(obj types.Object) int { - switch obj.(type) { - case *types.Const: - return constTag - case *types.TypeName: - return typeTag - case *types.Var: - return varTag - case *types.Func: - return funcTag - default: - errorf("unexpected object: %v (%T)", obj, obj) // panics - panic("unreachable") - } -} - -func sameObj(a, b types.Object) bool { - // Because unnamed types are not canonicalized, we cannot simply compare types for - // (pointer) identity. - // Ideally we'd check equality of constant values as well, but this is good enough. - return objTag(a) == objTag(b) && types.Identical(a.Type(), b.Type()) -} - -func (p *importer) declare(obj types.Object) { - pkg := obj.Pkg() - if alt := pkg.Scope().Insert(obj); alt != nil { - // This can only trigger if we import a (non-type) object a second time. - // Excluding type aliases, this cannot happen because 1) we only import a package - // once; and b) we ignore compiler-specific export data which may contain - // functions whose inlined function bodies refer to other functions that - // were already imported. - // However, type aliases require reexporting the original type, so we need - // to allow it (see also the comment in cmd/compile/internal/gc/bimport.go, - // method importer.obj, switch case importing functions). - // TODO(gri) review/update this comment once the gc compiler handles type aliases. - if !sameObj(obj, alt) { - errorf("inconsistent import:\n\t%v\npreviously imported as:\n\t%v\n", obj, alt) - } - } -} - -func (p *importer) obj(tag int) { - switch tag { - case constTag: - pos := p.pos() - pkg, name := p.qualifiedName() - typ := p.typ(nil, nil) - val := p.value() - p.declare(types.NewConst(pos, pkg, name, typ, val)) - - case aliasTag: - // TODO(gri) verify type alias hookup is correct - pos := p.pos() - pkg, name := p.qualifiedName() - typ := p.typ(nil, nil) - p.declare(types.NewTypeName(pos, pkg, name, typ)) - - case typeTag: - p.typ(nil, nil) - - case varTag: - pos := p.pos() - pkg, name := p.qualifiedName() - typ := p.typ(nil, nil) - p.declare(types.NewVar(pos, pkg, name, typ)) - - case funcTag: - pos := p.pos() - pkg, name := p.qualifiedName() - params, isddd := p.paramList() - result, _ := p.paramList() - sig := types.NewSignature(nil, params, result, isddd) - p.declare(types.NewFunc(pos, pkg, name, sig)) - - default: - errorf("unexpected object tag %d", tag) - } -} - const deltaNewFile = -64 // see cmd/compile/internal/gc/bexport.go -func (p *importer) pos() token.Pos { - if !p.posInfoFormat { - return token.NoPos - } - - file := p.prevFile - line := p.prevLine - delta := p.int() - line += delta - if p.version >= 5 { - if delta == deltaNewFile { - if n := p.int(); n >= 0 { - // file changed - file = p.path() - line = n - } - } - } else { - if delta == 0 { - if n := p.int(); n >= 0 { - // file changed - file = p.prevFile[:n] + p.string() - line = p.int() - } - } - } - p.prevFile = file - p.prevLine = line - - return p.fake.pos(file, line, 0) -} - // Synthesize a token.Pos type fakeFileSet struct { fset *token.FileSet @@ -389,205 +73,6 @@ var ( fakeLinesOnce sync.Once ) -func (p *importer) qualifiedName() (pkg *types.Package, name string) { - name = p.string() - pkg = p.pkg() - return -} - -func (p *importer) record(t types.Type) { - p.typList = append(p.typList, t) -} - -// A dddSlice is a types.Type representing ...T parameters. -// It only appears for parameter types and does not escape -// the importer. -type dddSlice struct { - elem types.Type -} - -func (t *dddSlice) Underlying() types.Type { return t } -func (t *dddSlice) String() string { return "..." + t.elem.String() } - -// parent is the package which declared the type; parent == nil means -// the package currently imported. The parent package is needed for -// exported struct fields and interface methods which don't contain -// explicit package information in the export data. -// -// A non-nil tname is used as the "owner" of the result type; i.e., -// the result type is the underlying type of tname. tname is used -// to give interface methods a named receiver type where possible. -func (p *importer) typ(parent *types.Package, tname *types.Named) types.Type { - // if the type was seen before, i is its index (>= 0) - i := p.tagOrIndex() - if i >= 0 { - return p.typList[i] - } - - // otherwise, i is the type tag (< 0) - switch i { - case namedTag: - // read type object - pos := p.pos() - parent, name := p.qualifiedName() - scope := parent.Scope() - obj := scope.Lookup(name) - - // if the object doesn't exist yet, create and insert it - if obj == nil { - obj = types.NewTypeName(pos, parent, name, nil) - scope.Insert(obj) - } - - if _, ok := obj.(*types.TypeName); !ok { - errorf("pkg = %s, name = %s => %s", parent, name, obj) - } - - // associate new named type with obj if it doesn't exist yet - t0 := types.NewNamed(obj.(*types.TypeName), nil, nil) - - // but record the existing type, if any - tname := obj.Type().(*types.Named) // tname is either t0 or the existing type - p.record(tname) - - // read underlying type - t0.SetUnderlying(p.typ(parent, t0)) - - // interfaces don't have associated methods - if types.IsInterface(t0) { - return tname - } - - // read associated methods - for i := p.int(); i > 0; i-- { - // TODO(gri) replace this with something closer to fieldName - pos := p.pos() - name := p.string() - if !exported(name) { - p.pkg() - } - - recv, _ := p.paramList() // TODO(gri) do we need a full param list for the receiver? - params, isddd := p.paramList() - result, _ := p.paramList() - p.int() // go:nointerface pragma - discarded - - sig := types.NewSignature(recv.At(0), params, result, isddd) - t0.AddMethod(types.NewFunc(pos, parent, name, sig)) - } - - return tname - - case arrayTag: - t := new(types.Array) - if p.trackAllTypes { - p.record(t) - } - - n := p.int64() - *t = *types.NewArray(p.typ(parent, nil), n) - return t - - case sliceTag: - t := new(types.Slice) - if p.trackAllTypes { - p.record(t) - } - - *t = *types.NewSlice(p.typ(parent, nil)) - return t - - case dddTag: - t := new(dddSlice) - if p.trackAllTypes { - p.record(t) - } - - t.elem = p.typ(parent, nil) - return t - - case structTag: - t := new(types.Struct) - if p.trackAllTypes { - p.record(t) - } - - *t = *types.NewStruct(p.fieldList(parent)) - return t - - case pointerTag: - t := new(types.Pointer) - if p.trackAllTypes { - p.record(t) - } - - *t = *types.NewPointer(p.typ(parent, nil)) - return t - - case signatureTag: - t := new(types.Signature) - if p.trackAllTypes { - p.record(t) - } - - params, isddd := p.paramList() - result, _ := p.paramList() - *t = *types.NewSignature(nil, params, result, isddd) - return t - - case interfaceTag: - // Create a dummy entry in the type list. This is safe because we - // cannot expect the interface type to appear in a cycle, as any - // such cycle must contain a named type which would have been - // first defined earlier. - // TODO(gri) Is this still true now that we have type aliases? - // See issue #23225. - n := len(p.typList) - if p.trackAllTypes { - p.record(nil) - } - - var embeddeds []types.Type - for n := p.int(); n > 0; n-- { - p.pos() - embeddeds = append(embeddeds, p.typ(parent, nil)) - } - - t := newInterface(p.methodList(parent, tname), embeddeds) - p.interfaceList = append(p.interfaceList, t) - if p.trackAllTypes { - p.typList[n] = t - } - return t - - case mapTag: - t := new(types.Map) - if p.trackAllTypes { - p.record(t) - } - - key := p.typ(parent, nil) - val := p.typ(parent, nil) - *t = *types.NewMap(key, val) - return t - - case chanTag: - t := new(types.Chan) - if p.trackAllTypes { - p.record(t) - } - - dir := chanDir(p.int()) - val := p.typ(parent, nil) - *t = *types.NewChan(dir, val) - return t - - default: - errorf("unexpected type tag %d", i) // panics - panic("unreachable") - } -} - func chanDir(d int) types.ChanDir { // tag values must match the constants in cmd/compile/internal/gc/go.go switch d { @@ -603,394 +88,6 @@ func chanDir(d int) types.ChanDir { } } -func (p *importer) fieldList(parent *types.Package) (fields []*types.Var, tags []string) { - if n := p.int(); n > 0 { - fields = make([]*types.Var, n) - tags = make([]string, n) - for i := range fields { - fields[i], tags[i] = p.field(parent) - } - } - return -} - -func (p *importer) field(parent *types.Package) (*types.Var, string) { - pos := p.pos() - pkg, name, alias := p.fieldName(parent) - typ := p.typ(parent, nil) - tag := p.string() - - anonymous := false - if name == "" { - // anonymous field - typ must be T or *T and T must be a type name - switch typ := deref(typ).(type) { - case *types.Basic: // basic types are named types - pkg = nil // // objects defined in Universe scope have no package - name = typ.Name() - case *types.Named: - name = typ.Obj().Name() - default: - errorf("named base type expected") - } - anonymous = true - } else if alias { - // anonymous field: we have an explicit name because it's an alias - anonymous = true - } - - return types.NewField(pos, pkg, name, typ, anonymous), tag -} - -func (p *importer) methodList(parent *types.Package, baseType *types.Named) (methods []*types.Func) { - if n := p.int(); n > 0 { - methods = make([]*types.Func, n) - for i := range methods { - methods[i] = p.method(parent, baseType) - } - } - return -} - -func (p *importer) method(parent *types.Package, baseType *types.Named) *types.Func { - pos := p.pos() - pkg, name, _ := p.fieldName(parent) - // If we don't have a baseType, use a nil receiver. - // A receiver using the actual interface type (which - // we don't know yet) will be filled in when we call - // types.Interface.Complete. - var recv *types.Var - if baseType != nil { - recv = types.NewVar(token.NoPos, parent, "", baseType) - } - params, isddd := p.paramList() - result, _ := p.paramList() - sig := types.NewSignature(recv, params, result, isddd) - return types.NewFunc(pos, pkg, name, sig) -} - -func (p *importer) fieldName(parent *types.Package) (pkg *types.Package, name string, alias bool) { - name = p.string() - pkg = parent - if pkg == nil { - // use the imported package instead - pkg = p.pkgList[0] - } - if p.version == 0 && name == "_" { - // version 0 didn't export a package for _ fields - return - } - switch name { - case "": - // 1) field name matches base type name and is exported: nothing to do - case "?": - // 2) field name matches base type name and is not exported: need package - name = "" - pkg = p.pkg() - case "@": - // 3) field name doesn't match type name (alias) - name = p.string() - alias = true - fallthrough - default: - if !exported(name) { - pkg = p.pkg() - } - } - return -} - -func (p *importer) paramList() (*types.Tuple, bool) { - n := p.int() - if n == 0 { - return nil, false - } - // negative length indicates unnamed parameters - named := true - if n < 0 { - n = -n - named = false - } - // n > 0 - params := make([]*types.Var, n) - isddd := false - for i := range params { - params[i], isddd = p.param(named) - } - return types.NewTuple(params...), isddd -} - -func (p *importer) param(named bool) (*types.Var, bool) { - t := p.typ(nil, nil) - td, isddd := t.(*dddSlice) - if isddd { - t = types.NewSlice(td.elem) - } - - var pkg *types.Package - var name string - if named { - name = p.string() - if name == "" { - errorf("expected named parameter") - } - if name != "_" { - pkg = p.pkg() - } - if i := strings.Index(name, "·"); i > 0 { - name = name[:i] // cut off gc-specific parameter numbering - } - } - - // read and discard compiler-specific info - p.string() - - return types.NewVar(token.NoPos, pkg, name, t), isddd -} - -func exported(name string) bool { - ch, _ := utf8.DecodeRuneInString(name) - return unicode.IsUpper(ch) -} - -func (p *importer) value() constant.Value { - switch tag := p.tagOrIndex(); tag { - case falseTag: - return constant.MakeBool(false) - case trueTag: - return constant.MakeBool(true) - case int64Tag: - return constant.MakeInt64(p.int64()) - case floatTag: - return p.float() - case complexTag: - re := p.float() - im := p.float() - return constant.BinaryOp(re, token.ADD, constant.MakeImag(im)) - case stringTag: - return constant.MakeString(p.string()) - case unknownTag: - return constant.MakeUnknown() - default: - errorf("unexpected value tag %d", tag) // panics - panic("unreachable") - } -} - -func (p *importer) float() constant.Value { - sign := p.int() - if sign == 0 { - return constant.MakeInt64(0) - } - - exp := p.int() - mant := []byte(p.string()) // big endian - - // remove leading 0's if any - for len(mant) > 0 && mant[0] == 0 { - mant = mant[1:] - } - - // convert to little endian - // TODO(gri) go/constant should have a more direct conversion function - // (e.g., once it supports a big.Float based implementation) - for i, j := 0, len(mant)-1; i < j; i, j = i+1, j-1 { - mant[i], mant[j] = mant[j], mant[i] - } - - // adjust exponent (constant.MakeFromBytes creates an integer value, - // but mant represents the mantissa bits such that 0.5 <= mant < 1.0) - exp -= len(mant) << 3 - if len(mant) > 0 { - for msd := mant[len(mant)-1]; msd&0x80 == 0; msd <<= 1 { - exp++ - } - } - - x := constant.MakeFromBytes(mant) - switch { - case exp < 0: - d := constant.Shift(constant.MakeInt64(1), token.SHL, uint(-exp)) - x = constant.BinaryOp(x, token.QUO, d) - case exp > 0: - x = constant.Shift(x, token.SHL, uint(exp)) - } - - if sign < 0 { - x = constant.UnaryOp(token.SUB, x, 0) - } - return x -} - -// ---------------------------------------------------------------------------- -// Low-level decoders - -func (p *importer) tagOrIndex() int { - if p.debugFormat { - p.marker('t') - } - - return int(p.rawInt64()) -} - -func (p *importer) int() int { - x := p.int64() - if int64(int(x)) != x { - errorf("exported integer too large") - } - return int(x) -} - -func (p *importer) int64() int64 { - if p.debugFormat { - p.marker('i') - } - - return p.rawInt64() -} - -func (p *importer) path() string { - if p.debugFormat { - p.marker('p') - } - // if the path was seen before, i is its index (>= 0) - // (the empty string is at index 0) - i := p.rawInt64() - if i >= 0 { - return p.pathList[i] - } - // otherwise, i is the negative path length (< 0) - a := make([]string, -i) - for n := range a { - a[n] = p.string() - } - s := strings.Join(a, "/") - p.pathList = append(p.pathList, s) - return s -} - -func (p *importer) string() string { - if p.debugFormat { - p.marker('s') - } - // if the string was seen before, i is its index (>= 0) - // (the empty string is at index 0) - i := p.rawInt64() - if i >= 0 { - return p.strList[i] - } - // otherwise, i is the negative string length (< 0) - if n := int(-i); n <= cap(p.buf) { - p.buf = p.buf[:n] - } else { - p.buf = make([]byte, n) - } - for i := range p.buf { - p.buf[i] = p.rawByte() - } - s := string(p.buf) - p.strList = append(p.strList, s) - return s -} - -func (p *importer) marker(want byte) { - if got := p.rawByte(); got != want { - errorf("incorrect marker: got %c; want %c (pos = %d)", got, want, p.read) - } - - pos := p.read - if n := int(p.rawInt64()); n != pos { - errorf("incorrect position: got %d; want %d", n, pos) - } -} - -// rawInt64 should only be used by low-level decoders. -func (p *importer) rawInt64() int64 { - i, err := binary.ReadVarint(p) - if err != nil { - errorf("read error: %v", err) - } - return i -} - -// rawStringln should only be used to read the initial version string. -func (p *importer) rawStringln(b byte) string { - p.buf = p.buf[:0] - for b != '\n' { - p.buf = append(p.buf, b) - b = p.rawByte() - } - return string(p.buf) -} - -// needed for binary.ReadVarint in rawInt64 -func (p *importer) ReadByte() (byte, error) { - return p.rawByte(), nil -} - -// byte is the bottleneck interface for reading p.data. -// It unescapes '|' 'S' to '$' and '|' '|' to '|'. -// rawByte should only be used by low-level decoders. -func (p *importer) rawByte() byte { - b := p.data[0] - r := 1 - if b == '|' { - b = p.data[1] - r = 2 - switch b { - case 'S': - b = '$' - case '|': - // nothing to do - default: - errorf("unexpected escape sequence in export data") - } - } - p.data = p.data[r:] - p.read += r - return b - -} - -// ---------------------------------------------------------------------------- -// Export format - -// Tags. Must be < 0. -const ( - // Objects - packageTag = -(iota + 1) - constTag - typeTag - varTag - funcTag - endTag - - // Types - namedTag - arrayTag - sliceTag - dddTag - structTag - pointerTag - signatureTag - interfaceTag - mapTag - chanTag - - // Values - falseTag - trueTag - int64Tag - floatTag - fractionTag // not used by gc - complexTag - stringTag - nilTag // only used by gc (appears in exported inlined function bodies) - unknownTag // not used by gc (only appears in packages with errors) - - // Type aliases - aliasTag -) - var predeclOnce sync.Once var predecl []types.Type // initialized lazily diff --git a/vendor/golang.org/x/tools/internal/gcimporter/gcimporter.go b/vendor/golang.org/x/tools/internal/gcimporter/gcimporter.go index a973dece9360..b1223713b940 100644 --- a/vendor/golang.org/x/tools/internal/gcimporter/gcimporter.go +++ b/vendor/golang.org/x/tools/internal/gcimporter/gcimporter.go @@ -230,20 +230,17 @@ func Import(packages map[string]*types.Package, path, srcDir string, lookup func // Or, define a new standard go/types/gcexportdata package. fset := token.NewFileSet() - // The indexed export format starts with an 'i'; the older - // binary export format starts with a 'c', 'd', or 'v' - // (from "version"). Select appropriate importer. + // Select appropriate importer. if len(data) > 0 { switch data[0] { - case 'i': - _, pkg, err := IImportData(fset, packages, data[1:], id) - return pkg, err + case 'v', 'c', 'd': // binary, till go1.10 + return nil, fmt.Errorf("binary (%c) import format is no longer supported", data[0]) - case 'v', 'c', 'd': - _, pkg, err := BImportData(fset, packages, data, id) + case 'i': // indexed, till go1.19 + _, pkg, err := IImportData(fset, packages, data[1:], id) return pkg, err - case 'u': + case 'u': // unified, from go1.20 _, pkg, err := UImportData(fset, packages, data[1:size], id) return pkg, err diff --git a/vendor/golang.org/x/tools/internal/gcimporter/iexport.go b/vendor/golang.org/x/tools/internal/gcimporter/iexport.go index ba53cdcdd107..eed1702186be 100644 --- a/vendor/golang.org/x/tools/internal/gcimporter/iexport.go +++ b/vendor/golang.org/x/tools/internal/gcimporter/iexport.go @@ -44,23 +44,23 @@ func IExportShallow(fset *token.FileSet, pkg *types.Package) ([]byte, error) { return out.Bytes(), err } -// IImportShallow decodes "shallow" types.Package data encoded by IExportShallow -// in the same executable. This function cannot import data from +// IImportShallow decodes "shallow" types.Package data encoded by +// IExportShallow in the same executable. This function cannot import data from // cmd/compile or gcexportdata.Write. -func IImportShallow(fset *token.FileSet, imports map[string]*types.Package, data []byte, path string, insert InsertType) (*types.Package, error) { +// +// The importer calls getPackages to obtain package symbols for all +// packages mentioned in the export data, including the one being +// decoded. +func IImportShallow(fset *token.FileSet, getPackages GetPackagesFunc, data []byte, path string) (*types.Package, error) { const bundle = false - pkgs, err := iimportCommon(fset, imports, data, bundle, path, insert) + const shallow = true + pkgs, err := iimportCommon(fset, getPackages, data, bundle, path, shallow) if err != nil { return nil, err } return pkgs[0], nil } -// InsertType is the type of a function that creates a types.TypeName -// object for a named type and inserts it into the scope of the -// specified Package. -type InsertType = func(pkg *types.Package, name string) - // Current bundled export format version. Increase with each format change. // 0: initial implementation const bundleVersion = 0 @@ -673,6 +673,9 @@ func (w *exportWriter) qualifiedType(obj *types.TypeName) { w.pkg(obj.Pkg()) } +// TODO(rfindley): what does 'pkg' even mean here? It would be better to pass +// it in explicitly into signatures and structs that may use it for +// constructing fields. func (w *exportWriter) typ(t types.Type, pkg *types.Package) { w.data.uint64(w.p.typOff(t, pkg)) } @@ -773,7 +776,21 @@ func (w *exportWriter) doTyp(t types.Type, pkg *types.Package) { if n > 0 { w.setPkg(t.Field(0).Pkg(), true) // qualifying package for field objects } else { - w.setPkg(pkg, true) + // TODO(rfindley): improve this very hacky logic. + // + // The importer expects a package to be set for all struct types, even + // those with no fields. A better encoding might be to set NumFields + // before pkg. setPkg panics with a nil package, which may be possible + // to reach with invalid packages (and perhaps valid packages, too?), so + // (arbitrarily) set the localpkg if available. + switch { + case pkg != nil: + w.setPkg(pkg, true) + case w.p.shallow: + w.setPkg(w.p.localpkg, true) + default: + panic(internalErrorf("no package to set for empty struct")) + } } w.uint64(uint64(n)) for i := 0; i < n; i++ { @@ -913,6 +930,17 @@ func (w *exportWriter) value(typ types.Type, v constant.Value) { w.int64(int64(v.Kind())) } + if v.Kind() == constant.Unknown { + // golang/go#60605: treat unknown constant values as if they have invalid type + // + // This loses some fidelity over the package type-checked from source, but that + // is acceptable. + // + // TODO(rfindley): we should switch on the recorded constant kind rather + // than the constant type + return + } + switch b := typ.Underlying().(*types.Basic); b.Info() & types.IsConstType { case types.IsBoolean: w.bool(constant.BoolVal(v)) @@ -969,6 +997,16 @@ func constantToFloat(x constant.Value) *big.Float { return &f } +func valueToRat(x constant.Value) *big.Rat { + // Convert little-endian to big-endian. + // I can't believe this is necessary. + bytes := constant.Bytes(x) + for i := 0; i < len(bytes)/2; i++ { + bytes[i], bytes[len(bytes)-1-i] = bytes[len(bytes)-1-i], bytes[i] + } + return new(big.Rat).SetInt(new(big.Int).SetBytes(bytes)) +} + // mpint exports a multi-precision integer. // // For unsigned types, small values are written out as a single @@ -1178,3 +1216,19 @@ func (q *objQueue) popHead() types.Object { q.head++ return obj } + +// internalError represents an error generated inside this package. +type internalError string + +func (e internalError) Error() string { return "gcimporter: " + string(e) } + +// TODO(adonovan): make this call panic, so that it's symmetric with errorf. +// Otherwise it's easy to forget to do anything with the error. +// +// TODO(adonovan): also, consider switching the names "errorf" and +// "internalErrorf" as the former is used for bugs, whose cause is +// internal inconsistency, whereas the latter is used for ordinary +// situations like bad input, whose cause is external. +func internalErrorf(format string, args ...interface{}) error { + return internalError(fmt.Sprintf(format, args...)) +} diff --git a/vendor/golang.org/x/tools/internal/gcimporter/iimport.go b/vendor/golang.org/x/tools/internal/gcimporter/iimport.go index 448f903e86a7..fb6554f92616 100644 --- a/vendor/golang.org/x/tools/internal/gcimporter/iimport.go +++ b/vendor/golang.org/x/tools/internal/gcimporter/iimport.go @@ -85,7 +85,7 @@ const ( // If the export data version is not recognized or the format is otherwise // compromised, an error is returned. func IImportData(fset *token.FileSet, imports map[string]*types.Package, data []byte, path string) (int, *types.Package, error) { - pkgs, err := iimportCommon(fset, imports, data, false, path, nil) + pkgs, err := iimportCommon(fset, GetPackagesFromMap(imports), data, false, path, false) if err != nil { return 0, nil, err } @@ -94,10 +94,49 @@ func IImportData(fset *token.FileSet, imports map[string]*types.Package, data [] // IImportBundle imports a set of packages from the serialized package bundle. func IImportBundle(fset *token.FileSet, imports map[string]*types.Package, data []byte) ([]*types.Package, error) { - return iimportCommon(fset, imports, data, true, "", nil) + return iimportCommon(fset, GetPackagesFromMap(imports), data, true, "", false) } -func iimportCommon(fset *token.FileSet, imports map[string]*types.Package, data []byte, bundle bool, path string, insert InsertType) (pkgs []*types.Package, err error) { +// A GetPackagesFunc function obtains the non-nil symbols for a set of +// packages, creating and recursively importing them as needed. An +// implementation should store each package symbol is in the Pkg +// field of the items array. +// +// Any error causes importing to fail. This can be used to quickly read +// the import manifest of an export data file without fully decoding it. +type GetPackagesFunc = func(items []GetPackagesItem) error + +// A GetPackagesItem is a request from the importer for the package +// symbol of the specified name and path. +type GetPackagesItem struct { + Name, Path string + Pkg *types.Package // to be filled in by GetPackagesFunc call + + // private importer state + pathOffset uint64 + nameIndex map[string]uint64 +} + +// GetPackagesFromMap returns a GetPackagesFunc that retrieves +// packages from the given map of package path to package. +// +// The returned function may mutate m: each requested package that is not +// found is created with types.NewPackage and inserted into m. +func GetPackagesFromMap(m map[string]*types.Package) GetPackagesFunc { + return func(items []GetPackagesItem) error { + for i, item := range items { + pkg, ok := m[item.Path] + if !ok { + pkg = types.NewPackage(item.Path, item.Name) + m[item.Path] = pkg + } + items[i].Pkg = pkg + } + return nil + } +} + +func iimportCommon(fset *token.FileSet, getPackages GetPackagesFunc, data []byte, bundle bool, path string, shallow bool) (pkgs []*types.Package, err error) { const currentVersion = iexportVersionCurrent version := int64(-1) if !debug { @@ -108,7 +147,7 @@ func iimportCommon(fset *token.FileSet, imports map[string]*types.Package, data } else if version > currentVersion { err = fmt.Errorf("cannot import %q (%v), export data is newer version - update tool", path, e) } else { - err = fmt.Errorf("cannot import %q (%v), possibly version skew - reinstall package", path, e) + err = fmt.Errorf("internal error while importing %q (%v); please report an issue", path, e) } } }() @@ -117,11 +156,8 @@ func iimportCommon(fset *token.FileSet, imports map[string]*types.Package, data r := &intReader{bytes.NewReader(data), path} if bundle { - bundleVersion := r.uint64() - switch bundleVersion { - case bundleVersion: - default: - errorf("unknown bundle format version %d", bundleVersion) + if v := r.uint64(); v != bundleVersion { + errorf("unknown bundle format version %d", v) } } @@ -139,7 +175,7 @@ func iimportCommon(fset *token.FileSet, imports map[string]*types.Package, data sLen := int64(r.uint64()) var fLen int64 var fileOffset []uint64 - if insert != nil { + if shallow { // Shallow mode uses a different position encoding. fLen = int64(r.uint64()) fileOffset = make([]uint64, r.uint64()) @@ -156,9 +192,9 @@ func iimportCommon(fset *token.FileSet, imports map[string]*types.Package, data r.Seek(sLen+fLen+dLen, io.SeekCurrent) p := iimporter{ - version: int(version), - ipath: path, - insert: insert, + version: int(version), + ipath: path, + usePosv2: shallow, // precise offsets are encoded only in shallow mode stringData: stringData, stringCache: make(map[uint64]string), @@ -185,8 +221,9 @@ func iimportCommon(fset *token.FileSet, imports map[string]*types.Package, data p.typCache[uint64(i)] = pt } - pkgList := make([]*types.Package, r.uint64()) - for i := range pkgList { + // Gather the relevant packages from the manifest. + items := make([]GetPackagesItem, r.uint64()) + for i := range items { pkgPathOff := r.uint64() pkgPath := p.stringAt(pkgPathOff) pkgName := p.stringAt(r.uint64()) @@ -195,30 +232,42 @@ func iimportCommon(fset *token.FileSet, imports map[string]*types.Package, data if pkgPath == "" { pkgPath = path } - pkg := imports[pkgPath] - if pkg == nil { - pkg = types.NewPackage(pkgPath, pkgName) - imports[pkgPath] = pkg - } else if pkg.Name() != pkgName { - errorf("conflicting names %s and %s for package %q", pkg.Name(), pkgName, path) - } - if i == 0 && !bundle { - p.localpkg = pkg - } - - p.pkgCache[pkgPathOff] = pkg + items[i].Name = pkgName + items[i].Path = pkgPath + items[i].pathOffset = pkgPathOff // Read index for package. nameIndex := make(map[string]uint64) nSyms := r.uint64() - // In shallow mode we don't expect an index for other packages. - assert(nSyms == 0 || p.localpkg == pkg || p.insert == nil) + // In shallow mode, only the current package (i=0) has an index. + assert(!(shallow && i > 0 && nSyms != 0)) for ; nSyms > 0; nSyms-- { name := p.stringAt(r.uint64()) nameIndex[name] = r.uint64() } - p.pkgIndex[pkg] = nameIndex + items[i].nameIndex = nameIndex + } + + // Request packages all at once from the client, + // enabling a parallel implementation. + if err := getPackages(items); err != nil { + return nil, err // don't wrap this error + } + + // Check the results and complete the index. + pkgList := make([]*types.Package, len(items)) + for i, item := range items { + pkg := item.Pkg + if pkg == nil { + errorf("internal error: getPackages returned nil package for %q", item.Path) + } else if pkg.Path() != item.Path { + errorf("internal error: getPackages returned wrong path %q, want %q", pkg.Path(), item.Path) + } else if pkg.Name() != item.Name { + errorf("internal error: getPackages returned wrong name %s for package %q, want %s", pkg.Name(), item.Path, item.Name) + } + p.pkgCache[item.pathOffset] = pkg + p.pkgIndex[pkg] = item.nameIndex pkgList[i] = pkg } @@ -289,8 +338,7 @@ type iimporter struct { version int ipath string - localpkg *types.Package - insert func(pkg *types.Package, name string) // "shallow" mode only + usePosv2 bool stringData []byte stringCache map[uint64]string @@ -338,13 +386,9 @@ func (p *iimporter) doDecl(pkg *types.Package, name string) { off, ok := p.pkgIndex[pkg][name] if !ok { - // In "shallow" mode, call back to the application to - // find the object and insert it into the package scope. - if p.insert != nil { - assert(pkg != p.localpkg) - p.insert(pkg, name) // "can't fail" - return - } + // In deep mode, the index should be complete. In shallow + // mode, we should have already recursively loaded necessary + // dependencies so the above Lookup succeeds. errorf("%v.%v not in index", pkg, name) } @@ -711,7 +755,7 @@ func (r *importReader) qualifiedIdent() (*types.Package, string) { } func (r *importReader) pos() token.Pos { - if r.p.insert != nil { // shallow mode + if r.p.usePosv2 { return r.posv2() } if r.p.version >= iexportVersionPosCol { diff --git a/vendor/golang.org/x/tools/internal/gcimporter/ureader_yes.go b/vendor/golang.org/x/tools/internal/gcimporter/ureader_yes.go index 34fc783f82b9..b977435f626d 100644 --- a/vendor/golang.org/x/tools/internal/gcimporter/ureader_yes.go +++ b/vendor/golang.org/x/tools/internal/gcimporter/ureader_yes.go @@ -10,6 +10,7 @@ package gcimporter import ( + "fmt" "go/token" "go/types" "sort" @@ -63,6 +64,14 @@ type typeInfo struct { } func UImportData(fset *token.FileSet, imports map[string]*types.Package, data []byte, path string) (_ int, pkg *types.Package, err error) { + if !debug { + defer func() { + if x := recover(); x != nil { + err = fmt.Errorf("internal error in importing %q (%v); please report an issue", path, x) + } + }() + } + s := string(data) s = s[:strings.LastIndex(s, "\n$$\n")] input := pkgbits.NewPkgDecoder(path, s) diff --git a/vendor/golang.org/x/tools/internal/gocommand/invoke.go b/vendor/golang.org/x/tools/internal/gocommand/invoke.go index d50551693f3d..8d9fc98d8f56 100644 --- a/vendor/golang.org/x/tools/internal/gocommand/invoke.go +++ b/vendor/golang.org/x/tools/internal/gocommand/invoke.go @@ -8,10 +8,12 @@ package gocommand import ( "bytes" "context" + "errors" "fmt" "io" "log" "os" + "reflect" "regexp" "runtime" "strconv" @@ -22,6 +24,9 @@ import ( exec "golang.org/x/sys/execabs" "golang.org/x/tools/internal/event" + "golang.org/x/tools/internal/event/keys" + "golang.org/x/tools/internal/event/label" + "golang.org/x/tools/internal/event/tag" ) // An Runner will run go command invocations and serialize @@ -51,9 +56,19 @@ func (runner *Runner) initialize() { // 1.14: go: updating go.mod: existing contents have changed since last read var modConcurrencyError = regexp.MustCompile(`go:.*go.mod.*contents have changed`) +// verb is an event label for the go command verb. +var verb = keys.NewString("verb", "go command verb") + +func invLabels(inv Invocation) []label.Label { + return []label.Label{verb.Of(inv.Verb), tag.Directory.Of(inv.WorkingDir)} +} + // Run is a convenience wrapper around RunRaw. // It returns only stdout and a "friendly" error. func (runner *Runner) Run(ctx context.Context, inv Invocation) (*bytes.Buffer, error) { + ctx, done := event.Start(ctx, "gocommand.Runner.Run", invLabels(inv)...) + defer done() + stdout, _, friendly, _ := runner.RunRaw(ctx, inv) return stdout, friendly } @@ -61,6 +76,9 @@ func (runner *Runner) Run(ctx context.Context, inv Invocation) (*bytes.Buffer, e // RunPiped runs the invocation serially, always waiting for any concurrent // invocations to complete first. func (runner *Runner) RunPiped(ctx context.Context, inv Invocation, stdout, stderr io.Writer) error { + ctx, done := event.Start(ctx, "gocommand.Runner.RunPiped", invLabels(inv)...) + defer done() + _, err := runner.runPiped(ctx, inv, stdout, stderr) return err } @@ -68,6 +86,8 @@ func (runner *Runner) RunPiped(ctx context.Context, inv Invocation, stdout, stde // RunRaw runs the invocation, serializing requests only if they fight over // go.mod changes. func (runner *Runner) RunRaw(ctx context.Context, inv Invocation) (*bytes.Buffer, *bytes.Buffer, error, error) { + ctx, done := event.Start(ctx, "gocommand.Runner.RunRaw", invLabels(inv)...) + defer done() // Make sure the runner is always initialized. runner.initialize() @@ -215,6 +235,18 @@ func (i *Invocation) run(ctx context.Context, stdout, stderr io.Writer) error { cmd := exec.Command("go", goArgs...) cmd.Stdout = stdout cmd.Stderr = stderr + + // cmd.WaitDelay was added only in go1.20 (see #50436). + if waitDelay := reflect.ValueOf(cmd).Elem().FieldByName("WaitDelay"); waitDelay.IsValid() { + // https://go.dev/issue/59541: don't wait forever copying stderr + // after the command has exited. + // After CL 484741 we copy stdout manually, so we we'll stop reading that as + // soon as ctx is done. However, we also don't want to wait around forever + // for stderr. Give a much-longer-than-reasonable delay and then assume that + // something has wedged in the kernel or runtime. + waitDelay.Set(reflect.ValueOf(30 * time.Second)) + } + // On darwin the cwd gets resolved to the real path, which breaks anything that // expects the working directory to keep the original path, including the // go command when dealing with modules. @@ -229,6 +261,7 @@ func (i *Invocation) run(ctx context.Context, stdout, stderr io.Writer) error { cmd.Env = append(cmd.Env, "PWD="+i.WorkingDir) cmd.Dir = i.WorkingDir } + defer func(start time.Time) { log("%s for %v", time.Since(start), cmdDebugStr(cmd)) }(time.Now()) return runCmdContext(ctx, cmd) @@ -242,10 +275,85 @@ var DebugHangingGoCommands = false // runCmdContext is like exec.CommandContext except it sends os.Interrupt // before os.Kill. -func runCmdContext(ctx context.Context, cmd *exec.Cmd) error { - if err := cmd.Start(); err != nil { +func runCmdContext(ctx context.Context, cmd *exec.Cmd) (err error) { + // If cmd.Stdout is not an *os.File, the exec package will create a pipe and + // copy it to the Writer in a goroutine until the process has finished and + // either the pipe reaches EOF or command's WaitDelay expires. + // + // However, the output from 'go list' can be quite large, and we don't want to + // keep reading (and allocating buffers) if we've already decided we don't + // care about the output. We don't want to wait for the process to finish, and + // we don't wait to wait for the WaitDelay to expire either. + // + // Instead, if cmd.Stdout requires a copying goroutine we explicitly replace + // it with a pipe (which is an *os.File), which we can close in order to stop + // copying output as soon as we realize we don't care about it. + var stdoutW *os.File + if cmd.Stdout != nil { + if _, ok := cmd.Stdout.(*os.File); !ok { + var stdoutR *os.File + stdoutR, stdoutW, err = os.Pipe() + if err != nil { + return err + } + prevStdout := cmd.Stdout + cmd.Stdout = stdoutW + + stdoutErr := make(chan error, 1) + go func() { + _, err := io.Copy(prevStdout, stdoutR) + if err != nil { + err = fmt.Errorf("copying stdout: %w", err) + } + stdoutErr <- err + }() + defer func() { + // We started a goroutine to copy a stdout pipe. + // Wait for it to finish, or terminate it if need be. + var err2 error + select { + case err2 = <-stdoutErr: + stdoutR.Close() + case <-ctx.Done(): + stdoutR.Close() + // Per https://pkg.go.dev/os#File.Close, the call to stdoutR.Close + // should cause the Read call in io.Copy to unblock and return + // immediately, but we still need to receive from stdoutErr to confirm + // that that has happened. + <-stdoutErr + err2 = ctx.Err() + } + if err == nil { + err = err2 + } + }() + + // Per https://pkg.go.dev/os/exec#Cmd, “If Stdout and Stderr are the + // same writer, and have a type that can be compared with ==, at most + // one goroutine at a time will call Write.” + // + // Since we're starting a goroutine that writes to cmd.Stdout, we must + // also update cmd.Stderr so that that still holds. + func() { + defer func() { recover() }() + if cmd.Stderr == prevStdout { + cmd.Stderr = cmd.Stdout + } + }() + } + } + + err = cmd.Start() + if stdoutW != nil { + // The child process has inherited the pipe file, + // so close the copy held in this process. + stdoutW.Close() + stdoutW = nil + } + if err != nil { return err } + resChan := make(chan error, 1) go func() { resChan <- cmd.Wait() @@ -253,11 +361,14 @@ func runCmdContext(ctx context.Context, cmd *exec.Cmd) error { // If we're interested in debugging hanging Go commands, stop waiting after a // minute and panic with interesting information. - if DebugHangingGoCommands { + debug := DebugHangingGoCommands + if debug { + timer := time.NewTimer(1 * time.Minute) + defer timer.Stop() select { case err := <-resChan: return err - case <-time.After(1 * time.Minute): + case <-timer.C: HandleHangingGoCommand(cmd.Process) case <-ctx.Done(): } @@ -270,30 +381,25 @@ func runCmdContext(ctx context.Context, cmd *exec.Cmd) error { } // Cancelled. Interrupt and see if it ends voluntarily. - cmd.Process.Signal(os.Interrupt) - select { - case err := <-resChan: - return err - case <-time.After(time.Second): + if err := cmd.Process.Signal(os.Interrupt); err == nil { + // (We used to wait only 1s but this proved + // fragile on loaded builder machines.) + timer := time.NewTimer(5 * time.Second) + defer timer.Stop() + select { + case err := <-resChan: + return err + case <-timer.C: + } } // Didn't shut down in response to interrupt. Kill it hard. // TODO(rfindley): per advice from bcmills@, it may be better to send SIGQUIT // on certain platforms, such as unix. - if err := cmd.Process.Kill(); err != nil && DebugHangingGoCommands { - // Don't panic here as this reliably fails on windows with EINVAL. + if err := cmd.Process.Kill(); err != nil && !errors.Is(err, os.ErrProcessDone) && debug { log.Printf("error killing the Go command: %v", err) } - // See above: don't wait indefinitely if we're debugging hanging Go commands. - if DebugHangingGoCommands { - select { - case err := <-resChan: - return err - case <-time.After(10 * time.Second): // a shorter wait as resChan should return quickly following Kill - HandleHangingGoCommand(cmd.Process) - } - } return <-resChan } diff --git a/vendor/golang.org/x/tools/internal/gocommand/version.go b/vendor/golang.org/x/tools/internal/gocommand/version.go index 307a76d474ad..446c5846a60f 100644 --- a/vendor/golang.org/x/tools/internal/gocommand/version.go +++ b/vendor/golang.org/x/tools/internal/gocommand/version.go @@ -23,21 +23,11 @@ import ( func GoVersion(ctx context.Context, inv Invocation, r *Runner) (int, error) { inv.Verb = "list" inv.Args = []string{"-e", "-f", `{{context.ReleaseTags}}`, `--`, `unsafe`} - inv.Env = append(append([]string{}, inv.Env...), "GO111MODULE=off") - // Unset any unneeded flags, and remove them from BuildFlags, if they're - // present. - inv.ModFile = "" + inv.BuildFlags = nil // This is not a build command. inv.ModFlag = "" - var buildFlags []string - for _, flag := range inv.BuildFlags { - // Flags can be prefixed by one or two dashes. - f := strings.TrimPrefix(strings.TrimPrefix(flag, "-"), "-") - if strings.HasPrefix(f, "mod=") || strings.HasPrefix(f, "modfile=") { - continue - } - buildFlags = append(buildFlags, flag) - } - inv.BuildFlags = buildFlags + inv.ModFile = "" + inv.Env = append(inv.Env[:len(inv.Env):len(inv.Env)], "GO111MODULE=off") + stdoutBytes, err := r.Run(ctx, inv) if err != nil { return 0, err diff --git a/vendor/golang.org/x/tools/internal/imports/fix.go b/vendor/golang.org/x/tools/internal/imports/fix.go index 642a5ac2d757..d4f1b4e8a0f2 100644 --- a/vendor/golang.org/x/tools/internal/imports/fix.go +++ b/vendor/golang.org/x/tools/internal/imports/fix.go @@ -26,6 +26,7 @@ import ( "unicode/utf8" "golang.org/x/tools/go/ast/astutil" + "golang.org/x/tools/internal/event" "golang.org/x/tools/internal/gocommand" "golang.org/x/tools/internal/gopathwalk" ) @@ -414,9 +415,16 @@ func (p *pass) fix() ([]*ImportFix, bool) { }) } } + // Collecting fixes involved map iteration, so sort for stability. See + // golang/go#59976. + sortFixes(fixes) + // collect selected fixes in a separate slice, so that it can be sorted + // separately. Note that these fixes must occur after fixes to existing + // imports. TODO(rfindley): figure out why. + var selectedFixes []*ImportFix for _, imp := range selected { - fixes = append(fixes, &ImportFix{ + selectedFixes = append(selectedFixes, &ImportFix{ StmtInfo: ImportInfo{ Name: p.importSpecName(imp), ImportPath: imp.ImportPath, @@ -425,8 +433,25 @@ func (p *pass) fix() ([]*ImportFix, bool) { FixType: AddImport, }) } + sortFixes(selectedFixes) - return fixes, true + return append(fixes, selectedFixes...), true +} + +func sortFixes(fixes []*ImportFix) { + sort.Slice(fixes, func(i, j int) bool { + fi, fj := fixes[i], fixes[j] + if fi.StmtInfo.ImportPath != fj.StmtInfo.ImportPath { + return fi.StmtInfo.ImportPath < fj.StmtInfo.ImportPath + } + if fi.StmtInfo.Name != fj.StmtInfo.Name { + return fi.StmtInfo.Name < fj.StmtInfo.Name + } + if fi.IdentName != fj.IdentName { + return fi.IdentName < fj.IdentName + } + return fi.FixType < fj.FixType + }) } // importSpecName gets the import name of imp in the import spec. @@ -519,7 +544,7 @@ func (p *pass) addCandidate(imp *ImportInfo, pkg *packageInfo) { var fixImports = fixImportsDefault func fixImportsDefault(fset *token.FileSet, f *ast.File, filename string, env *ProcessEnv) error { - fixes, err := getFixes(fset, f, filename, env) + fixes, err := getFixes(context.Background(), fset, f, filename, env) if err != nil { return err } @@ -529,7 +554,7 @@ func fixImportsDefault(fset *token.FileSet, f *ast.File, filename string, env *P // getFixes gets the import fixes that need to be made to f in order to fix the imports. // It does not modify the ast. -func getFixes(fset *token.FileSet, f *ast.File, filename string, env *ProcessEnv) ([]*ImportFix, error) { +func getFixes(ctx context.Context, fset *token.FileSet, f *ast.File, filename string, env *ProcessEnv) ([]*ImportFix, error) { abs, err := filepath.Abs(filename) if err != nil { return nil, err @@ -583,7 +608,7 @@ func getFixes(fset *token.FileSet, f *ast.File, filename string, env *ProcessEnv // Go look for candidates in $GOPATH, etc. We don't necessarily load // the real exports of sibling imports, so keep assuming their contents. - if err := addExternalCandidates(p, p.missingRefs, filename); err != nil { + if err := addExternalCandidates(ctx, p, p.missingRefs, filename); err != nil { return nil, err } @@ -1031,7 +1056,10 @@ type scanCallback struct { exportsLoaded func(pkg *pkg, exports []string) } -func addExternalCandidates(pass *pass, refs references, filename string) error { +func addExternalCandidates(ctx context.Context, pass *pass, refs references, filename string) error { + ctx, done := event.Start(ctx, "imports.addExternalCandidates") + defer done() + var mu sync.Mutex found := make(map[string][]pkgDistance) callback := &scanCallback{ diff --git a/vendor/golang.org/x/tools/internal/imports/imports.go b/vendor/golang.org/x/tools/internal/imports/imports.go index 95a88383a792..58e637b90f24 100644 --- a/vendor/golang.org/x/tools/internal/imports/imports.go +++ b/vendor/golang.org/x/tools/internal/imports/imports.go @@ -11,6 +11,7 @@ package imports import ( "bufio" "bytes" + "context" "fmt" "go/ast" "go/format" @@ -23,6 +24,7 @@ import ( "strings" "golang.org/x/tools/go/ast/astutil" + "golang.org/x/tools/internal/event" ) // Options is golang.org/x/tools/imports.Options with extra internal-only options. @@ -66,14 +68,17 @@ func Process(filename string, src []byte, opt *Options) (formatted []byte, err e // // Note that filename's directory influences which imports can be chosen, // so it is important that filename be accurate. -func FixImports(filename string, src []byte, opt *Options) (fixes []*ImportFix, err error) { +func FixImports(ctx context.Context, filename string, src []byte, opt *Options) (fixes []*ImportFix, err error) { + ctx, done := event.Start(ctx, "imports.FixImports") + defer done() + fileSet := token.NewFileSet() file, _, err := parse(fileSet, filename, src, opt) if err != nil { return nil, err } - return getFixes(fileSet, file, filename, opt.Env) + return getFixes(ctx, fileSet, file, filename, opt.Env) } // ApplyFixes applies all of the fixes to the file and formats it. extraMode diff --git a/vendor/golang.org/x/tools/internal/imports/mod.go b/vendor/golang.org/x/tools/internal/imports/mod.go index 7d99d04ca8ad..977d2389da12 100644 --- a/vendor/golang.org/x/tools/internal/imports/mod.go +++ b/vendor/golang.org/x/tools/internal/imports/mod.go @@ -19,6 +19,7 @@ import ( "strings" "golang.org/x/mod/module" + "golang.org/x/tools/internal/event" "golang.org/x/tools/internal/gocommand" "golang.org/x/tools/internal/gopathwalk" ) @@ -37,7 +38,7 @@ type ModuleResolver struct { mains []*gocommand.ModuleJSON mainByDir map[string]*gocommand.ModuleJSON modsByModPath []*gocommand.ModuleJSON // All modules, ordered by # of path components in module Path... - modsByDir []*gocommand.ModuleJSON // ...or Dir. + modsByDir []*gocommand.ModuleJSON // ...or number of path components in their Dir. // moduleCacheCache stores information about the module cache. moduleCacheCache *dirInfoCache @@ -123,7 +124,7 @@ func (r *ModuleResolver) init() error { }) sort.Slice(r.modsByDir, func(i, j int) bool { count := func(x int) int { - return strings.Count(r.modsByDir[x].Dir, "/") + return strings.Count(r.modsByDir[x].Dir, string(filepath.Separator)) } return count(j) < count(i) // descending order }) @@ -327,6 +328,10 @@ func (r *ModuleResolver) findModuleByDir(dir string) *gocommand.ModuleJSON { // - in /vendor/ in -mod=vendor mode. // - nested module? Dunno. // Rumor has it that replace targets cannot contain other replace targets. + // + // Note that it is critical here that modsByDir is sorted to have deeper dirs + // first. This ensures that findModuleByDir finds the innermost module. + // See also golang/go#56291. for _, m := range r.modsByDir { if !strings.HasPrefix(dir, m.Dir) { continue @@ -424,6 +429,9 @@ func (r *ModuleResolver) loadPackageNames(importPaths []string, srcDir string) ( } func (r *ModuleResolver) scan(ctx context.Context, callback *scanCallback) error { + ctx, done := event.Start(ctx, "imports.ModuleResolver.scan") + defer done() + if err := r.init(); err != nil { return err } diff --git a/vendor/golang.org/x/tools/internal/tokeninternal/tokeninternal.go b/vendor/golang.org/x/tools/internal/tokeninternal/tokeninternal.go index a3fb2d4f29d0..7e638ec24fcb 100644 --- a/vendor/golang.org/x/tools/internal/tokeninternal/tokeninternal.go +++ b/vendor/golang.org/x/tools/internal/tokeninternal/tokeninternal.go @@ -7,7 +7,9 @@ package tokeninternal import ( + "fmt" "go/token" + "sort" "sync" "unsafe" ) @@ -57,3 +59,93 @@ func GetLines(file *token.File) []int { panic("unexpected token.File size") } } + +// AddExistingFiles adds the specified files to the FileSet if they +// are not already present. It panics if any pair of files in the +// resulting FileSet would overlap. +func AddExistingFiles(fset *token.FileSet, files []*token.File) { + // Punch through the FileSet encapsulation. + type tokenFileSet struct { + // This type remained essentially consistent from go1.16 to go1.21. + mutex sync.RWMutex + base int + files []*token.File + _ *token.File // changed to atomic.Pointer[token.File] in go1.19 + } + + // If the size of token.FileSet changes, this will fail to compile. + const delta = int64(unsafe.Sizeof(tokenFileSet{})) - int64(unsafe.Sizeof(token.FileSet{})) + var _ [-delta * delta]int + + type uP = unsafe.Pointer + var ptr *tokenFileSet + *(*uP)(uP(&ptr)) = uP(fset) + ptr.mutex.Lock() + defer ptr.mutex.Unlock() + + // Merge and sort. + newFiles := append(ptr.files, files...) + sort.Slice(newFiles, func(i, j int) bool { + return newFiles[i].Base() < newFiles[j].Base() + }) + + // Reject overlapping files. + // Discard adjacent identical files. + out := newFiles[:0] + for i, file := range newFiles { + if i > 0 { + prev := newFiles[i-1] + if file == prev { + continue + } + if prev.Base()+prev.Size()+1 > file.Base() { + panic(fmt.Sprintf("file %s (%d-%d) overlaps with file %s (%d-%d)", + prev.Name(), prev.Base(), prev.Base()+prev.Size(), + file.Name(), file.Base(), file.Base()+file.Size())) + } + } + out = append(out, file) + } + newFiles = out + + ptr.files = newFiles + + // Advance FileSet.Base(). + if len(newFiles) > 0 { + last := newFiles[len(newFiles)-1] + newBase := last.Base() + last.Size() + 1 + if ptr.base < newBase { + ptr.base = newBase + } + } +} + +// FileSetFor returns a new FileSet containing a sequence of new Files with +// the same base, size, and line as the input files, for use in APIs that +// require a FileSet. +// +// Precondition: the input files must be non-overlapping, and sorted in order +// of their Base. +func FileSetFor(files ...*token.File) *token.FileSet { + fset := token.NewFileSet() + for _, f := range files { + f2 := fset.AddFile(f.Name(), f.Base(), f.Size()) + lines := GetLines(f) + f2.SetLines(lines) + } + return fset +} + +// CloneFileSet creates a new FileSet holding all files in fset. It does not +// create copies of the token.Files in fset: they are added to the resulting +// FileSet unmodified. +func CloneFileSet(fset *token.FileSet) *token.FileSet { + var files []*token.File + fset.Iterate(func(f *token.File) bool { + files = append(files, f) + return true + }) + newFileSet := token.NewFileSet() + AddExistingFiles(newFileSet, files) + return newFileSet +} diff --git a/vendor/golang.org/x/tools/internal/typeparams/common.go b/vendor/golang.org/x/tools/internal/typeparams/common.go index cfba8189f154..b9e87c691a35 100644 --- a/vendor/golang.org/x/tools/internal/typeparams/common.go +++ b/vendor/golang.org/x/tools/internal/typeparams/common.go @@ -105,6 +105,26 @@ func OriginMethod(fn *types.Func) *types.Func { } orig := NamedTypeOrigin(named) gfn, _, _ := types.LookupFieldOrMethod(orig, true, fn.Pkg(), fn.Name()) + + // This is a fix for a gopls crash (#60628) due to a go/types bug (#60634). In: + // package p + // type T *int + // func (*T) f() {} + // LookupFieldOrMethod(T, true, p, f)=nil, but NewMethodSet(*T)={(*T).f}. + // Here we make them consistent by force. + // (The go/types bug is general, but this workaround is reached only + // for generic T thanks to the early return above.) + if gfn == nil { + mset := types.NewMethodSet(types.NewPointer(orig)) + for i := 0; i < mset.Len(); i++ { + m := mset.At(i) + if m.Obj().Id() == fn.Id() { + gfn = m.Obj() + break + } + } + } + return gfn.(*types.Func) } diff --git a/vendor/golang.org/x/tools/internal/typesinternal/types.go b/vendor/golang.org/x/tools/internal/typesinternal/types.go index 3c53fbc63b94..ce7d4351b220 100644 --- a/vendor/golang.org/x/tools/internal/typesinternal/types.go +++ b/vendor/golang.org/x/tools/internal/typesinternal/types.go @@ -11,8 +11,6 @@ import ( "go/types" "reflect" "unsafe" - - "golang.org/x/tools/go/types/objectpath" ) func SetUsesCgo(conf *types.Config) bool { @@ -52,10 +50,3 @@ func ReadGo116ErrorData(err types.Error) (code ErrorCode, start, end token.Pos, } var SetGoVersion = func(conf *types.Config, version string) bool { return false } - -// NewObjectpathEncoder returns a function closure equivalent to -// objectpath.For but amortized for multiple (sequential) calls. -// It is a temporary workaround, pending the approval of proposal 58668. -// -//go:linkname NewObjectpathFunc golang.org/x/tools/go/types/objectpath.newEncoderFor -func NewObjectpathFunc() func(types.Object) (objectpath.Path, error) diff --git a/vendor/knative.dev/networking/config/config-network.yaml b/vendor/knative.dev/networking/config/config-network.yaml index d87048a2c19b..efec10718cef 100644 --- a/vendor/knative.dev/networking/config/config-network.yaml +++ b/vendor/knative.dev/networking/config/config-network.yaml @@ -22,7 +22,7 @@ metadata: app.kubernetes.io/component: networking app.kubernetes.io/version: devel annotations: - knative.dev/example-checksum: "2b6d10ba" + knative.dev/example-checksum: "a576301d" data: _example: | ################################ @@ -88,7 +88,7 @@ data: # value is "{{.Name}}.{{.Namespace}}.{{.Domain}}". # # Valid variables defined in the template include Name, Namespace, Domain, - # Labels, and Annotations. Name will be the result of the tagTemplate + # Labels, and Annotations. Name will be the result of the tag-template # below, if a tag is specified for the route. # # Changing this value might be necessary when the extra levels in @@ -108,10 +108,10 @@ data: # would be {Name}-{Namespace}.foo.{Domain} domain-template: "{{.Name}}.{{.Namespace}}.{{.Domain}}" - # tagTemplate specifies the golang text template string to use + # tag-template specifies the golang text template string to use # when constructing the DNS name for "tags" within the traffic blocks # of Routes and Configuration. This is used in conjunction with the - # domainTemplate above to determine the full URL for the tag. + # domain-template above to determine the full URL for the tag. tag-template: "{{.Tag}}-{{.Name}}" # Controls whether TLS certificates are automatically provisioned and diff --git a/vendor/knative.dev/pkg/metrics/metrics.go b/vendor/knative.dev/pkg/metrics/metrics.go index 453e1b84acb7..b65f470cce8b 100644 --- a/vendor/knative.dev/pkg/metrics/metrics.go +++ b/vendor/knative.dev/pkg/metrics/metrics.go @@ -19,12 +19,12 @@ package metrics import ( "context" "net/url" + "sync/atomic" "time" "go.opencensus.io/stats" "go.opencensus.io/stats/view" "go.opencensus.io/tag" - "go.uber.org/atomic" "k8s.io/client-go/tools/cache" "k8s.io/client-go/tools/metrics" "k8s.io/client-go/util/workqueue" @@ -74,13 +74,13 @@ var _ workqueue.GaugeMetric = (*gaugeMetric)(nil) // Inc implements CounterMetric func (m *gaugeMetric) Inc() { - total := m.total.Inc() + total := m.total.Add(1) Record(context.Background(), m.measure.M(total), stats.WithTags(m.mutators...)) } // Dec implements GaugeMetric func (m *gaugeMetric) Dec() { - total := m.total.Dec() + total := m.total.Add(-1) Record(context.Background(), m.measure.M(total), stats.WithTags(m.mutators...)) } diff --git a/vendor/knative.dev/pkg/profiling/server.go b/vendor/knative.dev/pkg/profiling/server.go index 36e08b4b426a..f362f36fa4db 100644 --- a/vendor/knative.dev/pkg/profiling/server.go +++ b/vendor/knative.dev/pkg/profiling/server.go @@ -22,9 +22,9 @@ import ( "net/http/pprof" "os" "strconv" + "sync/atomic" "time" - "go.uber.org/atomic" "go.uber.org/zap" corev1 "k8s.io/api/core/v1" ) @@ -63,8 +63,11 @@ func NewHandler(logger *zap.SugaredLogger, enableProfiling bool) *Handler { mux.HandleFunc(pprofPrefix+"trace", pprof.Trace) logger.Info("Profiling enabled: ", enableProfiling) + var enabled atomic.Bool + enabled.Store(enableProfiling) + return &Handler{ - enabled: atomic.NewBool(enableProfiling), + enabled: &enabled, handler: mux, log: logger, } diff --git a/vendor/knative.dev/pkg/reconciler/testing/context.go b/vendor/knative.dev/pkg/reconciler/testing/context.go index 150c59bf20b4..0a36caefc281 100644 --- a/vendor/knative.dev/pkg/reconciler/testing/context.go +++ b/vendor/knative.dev/pkg/reconciler/testing/context.go @@ -18,11 +18,10 @@ package testing import ( "context" + "sync/atomic" "testing" "time" - "go.uber.org/atomic" - "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/runtime/schema" @@ -94,7 +93,7 @@ func RunAndSyncInformers(ctx context.Context, informers ...controller.Informer) c.PrependReactor("list", "*", func(action clientgotesting.Action) (handled bool, ret runtime.Object, err error) { // Every list (before actual informer usage) is going to be followed by a Watch call. - watchesPending.Inc() + watchesPending.Add(1) return false, nil, nil }) @@ -108,7 +107,7 @@ func RunAndSyncInformers(ctx context.Context, informers ...controller.Informer) return false, nil, err } - watchesPending.Dec() + watchesPending.Add(-1) return true, watch, nil }) diff --git a/vendor/knative.dev/pkg/reconciler/testing/hooks.go b/vendor/knative.dev/pkg/reconciler/testing/hooks.go index c89be34a0f5e..c4129c6124db 100644 --- a/vendor/knative.dev/pkg/reconciler/testing/hooks.go +++ b/vendor/knative.dev/pkg/reconciler/testing/hooks.go @@ -20,9 +20,9 @@ package testing import ( "errors" "sync" + "sync/atomic" "time" - "go.uber.org/atomic" "k8s.io/apimachinery/pkg/runtime" kubetesting "k8s.io/client-go/testing" ) @@ -94,16 +94,18 @@ type Hooks struct { // more fake clients and wait for all hooks to complete. // TODO(grantr): Allow validating that a hook never fires func NewHooks() *Hooks { + var ci atomic.Int32 + ci.Store(-1) return &Hooks{ completionCh: make(chan int32, 100), - completionIndex: atomic.NewInt32(-1), + completionIndex: &ci, } } // OnCreate attaches a create hook to the given Fake. The hook function is // executed every time a resource of the given type is created. func (h *Hooks) OnCreate(fake *kubetesting.Fake, resource string, rf CreateHookFunc) { - index := h.completionIndex.Inc() + index := h.completionIndex.Add(1) fake.PrependReactor("create", resource, func(a kubetesting.Action) (bool, runtime.Object, error) { obj := a.(kubetesting.CreateActionImpl).Object @@ -119,7 +121,7 @@ func (h *Hooks) OnCreate(fake *kubetesting.Fake, resource string, rf CreateHookF // OnUpdate attaches an update hook to the given Fake. The hook function is // executed every time a resource of the given type is updated. func (h *Hooks) OnUpdate(fake *kubetesting.Fake, resource string, rf UpdateHookFunc) { - index := h.completionIndex.Inc() + index := h.completionIndex.Add(1) fake.PrependReactor("update", resource, func(a kubetesting.Action) (bool, runtime.Object, error) { obj := a.(kubetesting.UpdateActionImpl).Object @@ -135,7 +137,7 @@ func (h *Hooks) OnUpdate(fake *kubetesting.Fake, resource string, rf UpdateHookF // OnDelete attaches a delete hook to the given Fake. The hook function is // executed every time a resource of the given type is deleted. func (h *Hooks) OnDelete(fake *kubetesting.Fake, resource string, rf DeleteHookFunc) { - index := h.completionIndex.Inc() + index := h.completionIndex.Add(1) fake.PrependReactor("delete", resource, func(a kubetesting.Action) (bool, runtime.Object, error) { name := a.(kubetesting.DeleteActionImpl).Name @@ -173,7 +175,7 @@ func (h *Hooks) WaitForHooks(timeout time.Duration) error { case i := <-h.completionCh: hookCompletions[i] = HookComplete if len(hookCompletions) == ci { - h.completionIndex.Dec() + h.completionIndex.Add(-1) return nil } case <-timer: diff --git a/vendor/knative.dev/pkg/test/zipkin/util.go b/vendor/knative.dev/pkg/test/zipkin/util.go index 72d867f19121..2e9b8dbae8ec 100644 --- a/vendor/knative.dev/pkg/test/zipkin/util.go +++ b/vendor/knative.dev/pkg/test/zipkin/util.go @@ -28,10 +28,10 @@ import ( "strconv" "strings" "sync" + "sync/atomic" "testing" "time" - "go.uber.org/atomic" tracingconfig "knative.dev/pkg/tracing/config" "github.com/openzipkin/zipkin-go/model" diff --git a/vendor/knative.dev/pkg/webhook/helper.go b/vendor/knative.dev/pkg/webhook/helper.go index f9ff2daa906a..a3647ac742aa 100644 --- a/vendor/knative.dev/pkg/webhook/helper.go +++ b/vendor/knative.dev/pkg/webhook/helper.go @@ -20,6 +20,7 @@ import ( "strings" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "knative.dev/pkg/webhook/certificates/resources" ) // EnsureLabelSelectorExpressions merges the current label selector's MatchExpressions @@ -66,3 +67,16 @@ func ensureLabelSelectorRequirements( return append(want, nonKnative...) } + +func getSecretDataKeyNamesOrDefault(sKey string, sCert string) (serverKey string, serverCert string) { + serverKey = resources.ServerKey + serverCert = resources.ServerCert + + if sKey != "" { + serverKey = sKey + } + if sCert != "" { + serverCert = sCert + } + return serverKey, serverCert +} diff --git a/vendor/knative.dev/pkg/webhook/webhook.go b/vendor/knative.dev/pkg/webhook/webhook.go index 92dd01ae35e2..7be0336acfc2 100644 --- a/vendor/knative.dev/pkg/webhook/webhook.go +++ b/vendor/knative.dev/pkg/webhook/webhook.go @@ -38,7 +38,6 @@ import ( admissionv1 "k8s.io/api/admission/v1" "knative.dev/pkg/logging" "knative.dev/pkg/system" - certresources "knative.dev/pkg/webhook/certificates/resources" ) // Options contains the configuration for the webhook @@ -58,6 +57,14 @@ type Options struct { // If no SecretName is provided, then the webhook serves without TLS. SecretName string + // ServerPrivateKeyName is the name for the webhook secret's data key e.g. `tls.key`. + // Default value is `server-key.pem` if no value is passed. + ServerPrivateKeyName string + + // ServerCertificateName is the name for the webhook secret's ca data key e.g. `tls.crt`. + // Default value is `server-cert.pem` if no value is passed. + ServerCertificateName string + // Port where the webhook is served. Per k8s admission // registration requirements this should be 443 unless there is // only a single port for the service. @@ -169,13 +176,14 @@ func New( logger.Errorw("failed to fetch secret", zap.Error(err)) return nil, nil } - - serverKey, ok := secret.Data[certresources.ServerKey] + webOpts := GetOptions(ctx) + sKey, sCert := getSecretDataKeyNamesOrDefault(webOpts.ServerPrivateKeyName, webOpts.ServerCertificateName) + serverKey, ok := secret.Data[sKey] if !ok { logger.Warn("server key missing") return nil, nil } - serverCert, ok := secret.Data[certresources.ServerCert] + serverCert, ok := secret.Data[sCert] if !ok { logger.Warn("server cert missing") return nil, nil diff --git a/vendor/modules.txt b/vendor/modules.txt index 0ac5d7fd0311..6f7a649a9efb 100644 --- a/vendor/modules.txt +++ b/vendor/modules.txt @@ -146,6 +146,9 @@ github.com/awslabs/amazon-ecr-credential-helper/ecr-login/api github.com/awslabs/amazon-ecr-credential-helper/ecr-login/cache github.com/awslabs/amazon-ecr-credential-helper/ecr-login/config github.com/awslabs/amazon-ecr-credential-helper/ecr-login/version +# github.com/benbjohnson/clock v1.1.0 +## explicit; go 1.15 +github.com/benbjohnson/clock # github.com/beorn7/perks v1.0.1 ## explicit; go 1.11 github.com/beorn7/perks/quantile @@ -155,7 +158,7 @@ github.com/blang/semver/v4 # github.com/blendle/zapdriver v1.3.1 ## explicit; go 1.12 github.com/blendle/zapdriver -# github.com/c2h5oh/datasize v0.0.0-20200112174442-28bbd4740fee +# github.com/c2h5oh/datasize v0.0.0-20220606134207-859f65c6625b ## explicit github.com/c2h5oh/datasize # github.com/census-instrumentation/opencensus-proto v0.4.1 @@ -214,7 +217,7 @@ github.com/evanphx/json-patch # github.com/evanphx/json-patch/v5 v5.6.0 ## explicit; go 1.12 github.com/evanphx/json-patch/v5 -# github.com/go-kit/log v0.2.0 +# github.com/go-kit/log v0.2.1 ## explicit; go 1.17 github.com/go-kit/log github.com/go-kit/log/level @@ -363,7 +366,7 @@ github.com/googleapis/gax-go/v2 github.com/googleapis/gax-go/v2/apierror github.com/googleapis/gax-go/v2/apierror/internal/proto github.com/googleapis/gax-go/v2/internal -# github.com/gorilla/websocket v1.4.2 +# github.com/gorilla/websocket v1.5.0 ## explicit; go 1.12 github.com/gorilla/websocket # github.com/grpc-ecosystem/grpc-gateway/v2 v2.11.3 @@ -424,11 +427,9 @@ github.com/mailru/easyjson github.com/mailru/easyjson/buffer github.com/mailru/easyjson/jlexer github.com/mailru/easyjson/jwriter -# github.com/matttproud/golang_protobuf_extensions v1.0.2 +# github.com/matttproud/golang_protobuf_extensions v1.0.4 ## explicit; go 1.9 github.com/matttproud/golang_protobuf_extensions/pbutil -# github.com/miekg/dns v1.1.41 -## explicit; go 1.13 # github.com/mitchellh/go-homedir v1.1.0 ## explicit github.com/mitchellh/go-homedir @@ -460,21 +461,21 @@ github.com/openzipkin/zipkin-go/reporter/recorder # github.com/pkg/errors v0.9.1 ## explicit github.com/pkg/errors -# github.com/prometheus/client_golang v1.14.0 +# github.com/prometheus/client_golang v1.16.0 ## explicit; go 1.17 github.com/prometheus/client_golang/prometheus github.com/prometheus/client_golang/prometheus/internal github.com/prometheus/client_golang/prometheus/promhttp -# github.com/prometheus/client_model v0.3.0 -## explicit; go 1.9 +# github.com/prometheus/client_model v0.4.0 +## explicit; go 1.18 github.com/prometheus/client_model/go -# github.com/prometheus/common v0.37.0 -## explicit; go 1.16 +# github.com/prometheus/common v0.44.0 +## explicit; go 1.18 github.com/prometheus/common/expfmt github.com/prometheus/common/internal/bitbucket.org/ww/goautoneg github.com/prometheus/common/model -# github.com/prometheus/procfs v0.8.0 -## explicit; go 1.17 +# github.com/prometheus/procfs v0.10.1 +## explicit; go 1.19 github.com/prometheus/procfs github.com/prometheus/procfs/internal/fs github.com/prometheus/procfs/internal/util @@ -482,6 +483,9 @@ github.com/prometheus/procfs/internal/util ## explicit; go 1.13 github.com/prometheus/statsd_exporter/pkg/mapper github.com/prometheus/statsd_exporter/pkg/mapper/fsm +# github.com/rs/dnscache v0.0.0-20211102005908-e0241e321417 +## explicit; go 1.12 +github.com/rs/dnscache # github.com/russross/blackfriday/v2 v2.1.0 ## explicit github.com/russross/blackfriday/v2 @@ -495,13 +499,14 @@ github.com/spf13/pflag ## explicit github.com/tsenart/go-tsz github.com/tsenart/go-tsz/testdata -# github.com/tsenart/vegeta/v12 v12.8.4 -## explicit; go 1.13 +# github.com/tsenart/vegeta/v12 v12.11.0 +## explicit; go 1.20 github.com/tsenart/vegeta/v12 github.com/tsenart/vegeta/v12/internal/resolver github.com/tsenart/vegeta/v12/lib github.com/tsenart/vegeta/v12/lib/lttb github.com/tsenart/vegeta/v12/lib/plot +github.com/tsenart/vegeta/v12/lib/prom # github.com/vbatts/tar-split v0.11.2 ## explicit; go 1.15 github.com/vbatts/tar-split/archive/tar @@ -537,10 +542,11 @@ go.uber.org/automaxprocs/maxprocs # go.uber.org/multierr v1.6.0 ## explicit; go 1.12 go.uber.org/multierr -# go.uber.org/zap v1.19.1 -## explicit; go 1.13 +# go.uber.org/zap v1.24.0 +## explicit; go 1.19 go.uber.org/zap go.uber.org/zap/buffer +go.uber.org/zap/internal go.uber.org/zap/internal/bufferpool go.uber.org/zap/internal/color go.uber.org/zap/internal/exit @@ -565,7 +571,7 @@ golang.org/x/crypto/openpgp/packet golang.org/x/crypto/openpgp/s2k golang.org/x/crypto/pkcs12 golang.org/x/crypto/pkcs12/internal/rc2 -# golang.org/x/mod v0.9.0 +# golang.org/x/mod v0.12.0 ## explicit; go 1.17 golang.org/x/mod/internal/lazyregexp golang.org/x/mod/module @@ -590,10 +596,11 @@ golang.org/x/oauth2/google/internal/externalaccount golang.org/x/oauth2/internal golang.org/x/oauth2/jws golang.org/x/oauth2/jwt -# golang.org/x/sync v0.2.0 -## explicit +# golang.org/x/sync v0.3.0 +## explicit; go 1.17 golang.org/x/sync/errgroup golang.org/x/sync/semaphore +golang.org/x/sync/singleflight # golang.org/x/sys v0.10.0 ## explicit; go 1.17 golang.org/x/sys/cpu @@ -614,18 +621,18 @@ golang.org/x/text/unicode/norm # golang.org/x/time v0.3.0 ## explicit golang.org/x/time/rate -# golang.org/x/tools v0.7.0 +# golang.org/x/tools v0.11.0 ## explicit; go 1.18 golang.org/x/tools/go/ast/astutil golang.org/x/tools/go/gcexportdata golang.org/x/tools/go/internal/packagesdriver golang.org/x/tools/go/packages -golang.org/x/tools/go/types/objectpath golang.org/x/tools/imports golang.org/x/tools/internal/event golang.org/x/tools/internal/event/core golang.org/x/tools/internal/event/keys golang.org/x/tools/internal/event/label +golang.org/x/tools/internal/event/tag golang.org/x/tools/internal/fastwalk golang.org/x/tools/internal/gcimporter golang.org/x/tools/internal/gocommand @@ -1282,7 +1289,7 @@ k8s.io/utils/net k8s.io/utils/pointer k8s.io/utils/strings/slices k8s.io/utils/trace -# knative.dev/caching v0.0.0-20230718155311-24ff72399d90 +# knative.dev/caching v0.0.0-20230802013852-e03e9f6594b3 ## explicit; go 1.18 knative.dev/caching/config knative.dev/caching/pkg/apis/caching @@ -1303,11 +1310,11 @@ knative.dev/caching/pkg/client/injection/informers/caching/v1alpha1/image/fake knative.dev/caching/pkg/client/injection/informers/factory knative.dev/caching/pkg/client/injection/informers/factory/fake knative.dev/caching/pkg/client/listers/caching/v1alpha1 -# knative.dev/hack v0.0.0-20230712131415-ddae80293c43 +# knative.dev/hack v0.0.0-20230802014852-338500eed425 ## explicit; go 1.18 knative.dev/hack knative.dev/hack/shell -# knative.dev/networking v0.0.0-20230718160410-75dcd54d9510 +# knative.dev/networking v0.0.0-20230802091048-29da3ac7ef4d ## explicit; go 1.18 knative.dev/networking/config knative.dev/networking/pkg @@ -1346,7 +1353,7 @@ knative.dev/networking/pkg/http/stats knative.dev/networking/pkg/ingress knative.dev/networking/pkg/k8s knative.dev/networking/pkg/prober -# knative.dev/pkg v0.0.0-20230718152110-aef227e72ead +# knative.dev/pkg v0.0.0-20230802191948-8d3f95106327 ## explicit; go 1.18 knative.dev/pkg/apiextensions/storageversion knative.dev/pkg/apiextensions/storageversion/cmd/migrate